Замаскируйте белый цвет из изображения PNG на iPhone

StackOverflow https://stackoverflow.com/questions/1714307

  •  19-09-2019
  •  | 
  •  

Вопрос

Я знаю, что уже есть 2 соответствующих поста на эту тему, но это непонятно...

Итак, дело обстоит так...:

У меня есть UIImage который состоит из png файл, запрошенный по URL-адресу в сети.Можно ли замаскировать белый цвет, чтобы он стал прозрачным?

Все, что я пробовал до сих пор с CGImageCreateWithMaskingColors, возвращает белое изображение...

Любая помощь, ребята, была бы бесценна :)

Это было полезно?

Решение

Хорошо, поскольку я нашел решение, и оно работает нормально, я отвечаю на свой вопрос, и я действительно верю, что это будет полезно многим людям, имеющим такую же потребность.

Прежде всего, я подумал, что было бы неплохо расширить мой UIImages через категорию:

UIImage+Утилиты.h

#import <UIKit/UIKit.h>

@interface UIImage (Utils)

- (UIImage*)imageByClearingWhitePixels;
@end

UIImage+Утилиты.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

Наконец, я могу использовать его следующим образом:(После того, как я импортировал UIImage+Utils.h конечно)

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

Другие советы

На самом деле это невозможно, по крайней мере, нет простого способа, и уж точно нет вызова API.По сути, это проблема редактирования изображений, обычно решаемая с помощью Photoshop.Большинство изображений с прозрачным фоном были созданы именно таким образом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top