gpt4 book ai didi

iphone - 如何使 UIImage 上的一种颜色透明?

转载 作者:行者123 更新时间:2023-12-03 18:15:20 26 4
gpt4 key购买 nike

在我的 iPhone 应用程序上,我有一个 UIImage 实例。我想获得一个派生的 UIImage,它是第一个 UIImage 的结果,其中它的一种颜色(例如洋红色)变为透明。我怎样才能做到这一点?

最佳答案

好的。尝试过我不知道这些解决方案有多少个版本,我有自己的定制版本。我发现the solution from @yubenyi工作得很好,但是如果你想从他的changeWhiteColorTransparent()函数中获取输出并将其传回,它就不起作用了。

我的第一步是更改他的函数以接受特定的颜色和容差,以便调用者可以指定一系列颜色以使其透明。这工作得很好,几乎没有变化,但我发现输出不是一个有效的图像,无法通过具有第二个颜色范围的相同代码。

经过大量的试验和错误,我通过自己进行颜色替换来完成这项工作。我拒绝这样做,因为当有 API 来完成这些事情时,这似乎是一项艰巨的工作,但它们并不总是按照您想要的方式运行。具体来说,CGImageCreateWithMaskingColors() 的输出不能用作同一函数的另一个调用的输入。我还没能弄清楚为什么,但我认为这与 Alpha channel 有关。

无论如何,我的解决方案是:

- (UIImage*) replaceColor:(UIColor*)color inImage:(UIImage*)image withTolerance:(float)tolerance {
CGImageRef imageRef = [image CGImage];

NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
NSUInteger bitmapByteCount = bytesPerRow * height;

unsigned char *rawData = (unsigned char*) calloc(bitmapByteCount, sizeof(unsigned char));

CGContextRef context = CGBitmapContextCreate(rawData, width, height,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);

CGColorRef cgColor = [color CGColor];
const CGFloat *components = CGColorGetComponents(cgColor);
float r = components[0];
float g = components[1];
float b = components[2];
//float a = components[3]; // not needed

r = r * 255.0;
g = g * 255.0;
b = b * 255.0;

const float redRange[2] = {
MAX(r - (tolerance / 2.0), 0.0),
MIN(r + (tolerance / 2.0), 255.0)
};

const float greenRange[2] = {
MAX(g - (tolerance / 2.0), 0.0),
MIN(g + (tolerance / 2.0), 255.0)
};

const float blueRange[2] = {
MAX(b - (tolerance / 2.0), 0.0),
MIN(b + (tolerance / 2.0), 255.0)
};

int byteIndex = 0;

while (byteIndex < bitmapByteCount) {
unsigned char red = rawData[byteIndex];
unsigned char green = rawData[byteIndex + 1];
unsigned char blue = rawData[byteIndex + 2];

if (((red >= redRange[0]) && (red <= redRange[1])) &&
((green >= greenRange[0]) && (green <= greenRange[1])) &&
((blue >= blueRange[0]) && (blue <= blueRange[1]))) {
// make the pixel transparent
//
rawData[byteIndex] = 0;
rawData[byteIndex + 1] = 0;
rawData[byteIndex + 2] = 0;
rawData[byteIndex + 3] = 0;
}

byteIndex += 4;
}

CGImageRef imgref = CGBitmapContextCreateImage(context);
UIImage *result = [UIImage imageWithCGImage:imgref];

CGImageRelease(imgref);
CGContextRelease(context);
free(rawData);

return result;
}

关于iphone - 如何使 UIImage 上的一种颜色透明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/633722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com