【问题标题】:Mask white color out of PNG image on iPhone在 iPhone 上屏蔽 PNG 图像中的白色
【发布时间】:2009-11-11 10:25:58
【问题描述】:

我知道已经有 2 个相关帖子,但不清楚...

所以情况是这样的……:

我有一个UIImage,其中包含一个从网络上的网址请求的png 文件。 是否可以将白色遮住使其变得透明?

到目前为止,我使用CGImageCreateWithMaskingColors 尝试的所有操作都返回白色图像...

任何帮助都是宝贵的:)

【问题讨论】:

    标签: iphone graphics png alpha


    【解决方案1】:

    好的,因为我找到了一个解决方案并且它工作正常,我正在回答我的问题,我真的相信这对许多有相同需求的人会有用。

    首先,我认为通过类别扩展我的UIImages 会很好:

    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
    

    最后,我可以这样使用它了:(当然是在我导入UIImage+Utils.h之后)

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

    【讨论】:

      【解决方案2】:

      这不太可能,至少没有简单的方法,当然没有 API 调用。它基本上是一个通常用 Photoshop 完成的图像编辑问题。大多数具有透明背景的图像都是以这种方式创建的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 2022-09-29
        • 2020-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多