我已经通过替换图像中的颜色,但无法让它按照我需要的方式工作,因为我尝试使用除了一种颜色以外的每种颜色以及透明度。
我正在寻找的是一种拍摄图像并从该图像中分离出一种颜色(比如所有纯黑色)的方法。然后取出拆分部分,制作一个带有透明背景和拆分部分的新图像。
(这里只是这个想法的一个例子,说我想拍这个页面的截图。制作其他颜色但纯黑色是透明的,并将新图像保存到库中,或者将其放入UIImageView)
我已经查看了CGImageCreateWithMaskingColors,但似乎无法用透明部分做我需要的东西,我真的不明白colorMasking输入,除了你可以提供{Rmin,Rmax,Gmin,Gmax,Bmin,Bmax颜色面具但是当我这样做时,它会为一切颜色着色。任何想法或意见都会很棒。
答案 0 :(得分:2)
听起来你将不得不访问底层字节并编写代码来直接处理它们。您可以使用CGImageGetDataProvider()
来访问图像的数据,但不能保证格式是您知道如何处理的。或者,您可以使用您知道如何处理的特定格式创建新的CGContextRef
,然后将原始图像绘制到新的上下文中,然后处理基础数据。这是一个快速尝试做你想要的(未编译):
- (UIImage *)imageWithBlackPixels:(UIImage *)image {
CGImageRef cgImage = image.CGImage;
// create a premultiplied ARGB context with 32bpp
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
size_t width = CGImageGetWidth(cgImage);
size_t height = CGImageGetHeight(cgImage);
size_t bpc = 8; // bits per component
size_t bpp = bpc * 4 / 8; // bytes per pixel
size_t bytesPerRow = bpp * width;
void *data = malloc(bytesPerRow * height);
CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host;
CGContextRef ctx = CGBitmapContextCreate(data, width, height, bpc, bytesPerRow, colorspace, bitmapInfo);
CGColorSpaceRelease(colorspace);
if (ctx == NULL) {
// couldn't create the context - double-check the parameters?
free(data);
return nil;
}
// draw the image into the context
CGContextDrawImage(ctx, CGRectMake(0, 0, width, height), cgImage);
// replace all non-black pixels with transparent
// preserve existing transparency on black pixels
for (size_t y = 0; y < height; y++) {
size_t rowStart = bytesPerRow * y;
for (size_t x = 0; x < width; x++) {
size_t pixelOffset = rowStart + x*bpp;
// check the RGB components of the pixel
if (data[pixelOffset+1] != 0 || data[pixelOffset+2] != 0 || data[pixelOffset+3] != 0) {
// this pixel contains non-black. zero it out
memset(&data[pixelOffset], 0, 4);
}
}
}
// create our new image and release the context data
CGImageRef newCGImage = CGBitmapContextCreateImage(ctx);
CGContextRelease(ctx);
free(data);
UIImage *newImage = [UIImage imageWithCGImage:newCGImage scale:image.scale orientation:image.imageOrientation];
CGImageRelease(newCGImage);
return newImage;
}