Frage

Ich weiß, dass es bereits zwei relevante Beiträge über das, aber es ist nicht klar, ...

So der Fall ist dies ...:

Ich habe eine UIImage, die aus einer png Datei von einer URL im Netz angefordert besteht. Ist es möglich, die weiße Farbe zu maskieren, damit es transparent wird?

Alles, was ich bisher versucht, mit CGImageCreateWithMaskingColors, gibt ein weißes Bild ...

Jede Hilfe Jungs wären wertvoll:)

War es hilfreich?

Lösung

Ok, da ich eine Lösung gefunden, und es funktioniert gut, ich meine Frage zu beantworten bin, und ich glaube wirklich, dass das viele Menschen von Nutzen sein wird, um das gleiche Bedürfnis haben.

Vor allem dachte ich, das wäre schön meine UIImages über eine Kategorie zu erweitern:

UIImage + Utils.h

#import <UIKit/UIKit.h>

@interface UIImage (Utils)

- (UIImage*)imageByClearingWhitePixels;
@end

UIImage + Utils.m

#import "UIImage+Utils.h"

@implementation UIImage (Utils)

#pragma mark Private Methods
- (CGImageRef) CopyImageAndAddAlphaChannel:(CGImageRef) sourceImage {
    CGImageRef retVal = NULL;

    size_t width = CGImageGetWidth(sourceImage);
    size_t height = CGImageGetHeight(sourceImage);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedFirst);

    if (offscreenContext != NULL) {
        CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage);

        retVal = CGBitmapContextCreateImage(offscreenContext);
        CGContextRelease(offscreenContext);
    }

    CGColorSpaceRelease(colorSpace);

    return retVal;
}

- (UIImage *) getMaskedArtworkFromPicture:(UIImage *)image withMask:(UIImage *)mask{

    UIImage *maskedImage;
    CGImageRef imageRef = [self CopyImageAndAddAlphaChannel:image.CGImage];
    CGImageRef maskRef = mask.CGImage;
    CGImageRef maskToApply = CGImageMaskCreate(CGImageGetWidth(maskRef),CGImageGetHeight(maskRef),CGImageGetBitsPerComponent(maskRef),CGImageGetBitsPerPixel(maskRef),CGImageGetBytesPerRow(maskRef),CGImageGetDataProvider(maskRef), NULL, NO);
    CGImageRef masked = CGImageCreateWithMask(imageRef, maskToApply);
    maskedImage = [UIImage imageWithCGImage:masked];
    CGImageRelease(imageRef);
    CGImageRelease(maskToApply);
    CGImageRelease(masked);
    return maskedImage;

}

#pragma mark Public Methods
- (UIImage*)imageByClearingWhitePixels{

    //Copy image bitmaps
    float originalWidth = self.size.width;
    float originalHeight = self.size.height;
    CGSize newSize;

    newSize = CGSizeMake(originalWidth, originalHeight);

    UIGraphicsBeginImageContext( newSize );

    [self drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    //Clear white color by masking with self
    newImage = [self getMaskedArtworkFromPicture:newImage withMask:newImage];

    return newImage;
}

@end

Schließlich, kann ich es wie folgt zu verwenden: (Nachdem ich UIImage+Utils.h natürlich importiert)

UIImage *myImage = [...]; //A local png file or a file from a url
UIImage *myWhitelessImage = [myImage imageByClearingWhitePixels]; // Hooray!

Andere Tipps

Es ist nicht wirklich möglich, zumindest keine einfache Möglichkeit, schon gar kein API-Aufruf. Es ist im Grunde ein Bildbearbeitungs Problem in der Regel mit Photoshop. Die meisten Bilder, die einen transparenten Hintergrund haben wurden auf diese Weise erstellt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top