【发布时间】:2009-11-11 10:25:58
【问题描述】:
我知道已经有 2 个相关帖子,但不清楚...
所以情况是这样的……:
我有一个UIImage,其中包含一个从网络上的网址请求的png 文件。
是否可以将白色遮住使其变得透明?
到目前为止,我使用CGImageCreateWithMaskingColors 尝试的所有操作都返回白色图像...
任何帮助都是宝贵的:)
【问题讨论】:
我知道已经有 2 个相关帖子,但不清楚...
所以情况是这样的……:
我有一个UIImage,其中包含一个从网络上的网址请求的png 文件。
是否可以将白色遮住使其变得透明?
到目前为止,我使用CGImageCreateWithMaskingColors 尝试的所有操作都返回白色图像...
任何帮助都是宝贵的:)
【问题讨论】:
好的,因为我找到了一个解决方案并且它工作正常,我正在回答我的问题,我真的相信这对许多有相同需求的人会有用。
首先,我认为通过类别扩展我的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!
【讨论】:
这不太可能,至少没有简单的方法,当然没有 API 调用。它基本上是一个通常用 Photoshop 完成的图像编辑问题。大多数具有透明背景的图像都是以这种方式创建的。
【讨论】: