Frage

Ich habe ein 300 x 400 Pixel PNG-24 mit Alpha-Kanal. Es geht um 140kb. Ich möchte ein paar Teile davon maskieren, so dass ich erstellt eine weitere 300 x 400 Bild als PNG-24, aber mit nur schwarz, grau und weiß und kein Alpha-Kanal.

Das Seltsame ist: Wo die Maske schwarz ist, wird das Bild nur gehalten Original. Keine Transparenz. Aber wo die Maske weiß ist, wird das Bild schwarz nur schwarz. Keine Transparenz.

Es funktioniert teilweise auf sehr kleine Bilder wie 50 x 50 Pixel. Jede Idee, was mit dieser Funktion falsch sein kann?

+ (UIImage*)maskImage:(UIImage*)image withMask:(UIImage*)maskImage {

    CGImageRef maskRef = maskImage.CGImage;
    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), 
                                        NULL, false);

    CGImageRef theImage = image.CGImage;
    CGImageRef masked = CGImageCreateWithMask(theImage, mask);
    return [UIImage imageWithCGImage:masked];
}

Mein Hintergrund ist orange, so dass diese Farbe durchscheinen soll. Die UIImageView, die das Bild hält, wird auf Clear / Transparenz und opaken = NO.

War es hilfreich?

Lösung

Ich denke, Ihr Code von hier . Es gibt diesen Kommentar:

  

Ich habe den Code verbessert, so dass es   richtig maskieren Bilder, die nicht über   ein Alphakanal.

Also, wenn es nicht für Sie arbeiten, vielleicht Ihr Bild nicht über einen Alpha-Kanal.

Andere Tipps

Seien Sie vorsichtig - dass Code-Lecks! Ich merkte es erst diese Methode in einer Schleife ausgeführt wird. Stellen Sie sicher, CGImageRelease(mask) und CGImageRelease(masked) aufrufen, bevor das Bild zurück.

- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage {

    CGImageRef maskRef = maskImage.CGImage;

    CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef), NULL, false);
    CGImageRef masked = CGImageCreateWithMask(image.CGImage, mask);

    UIImage *img = [UIImage imageWithCGImage:masked];

    //otherwise we will leak
    CGImageRelease(mask);
    CGImageRelease(masked);

    return img;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top