gpt4 book ai didi

iPhone将彩色图像转换为2位图像(黑白)

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

我需要帮助将彩色图像转换为“黑白”,而不是灰度。

我如何使用 iPhone SDK 和 Core Graphics 来做到这一点,因为我相信这是可能的。

最佳答案

这是可能的,我之前尝试过两条路径:

  1. 转换为灰度,然后逐像素转换为黑白。
    --问题是我在透明图像上没有得到好的结果。

  2. 如果您不是很严格,给定 RGBA 图像,获取像素 RGB 平均值并使用提供的阈值转换为黑白并保留其透明度。从技术上讲,这仍然是 RGBA,但更多的是黑色、白色和透明度。

例如

  UIImage *originalImage = [UIImage imageNamed:@"option_bluetooth.png"];  

unsigned char *pixelBuffer = [self getPixelData:originalImage.CGImage];
size_t length = originalImage.size.width * originalImage.size.height * 4;
CGFloat intensity;
int bw;
//50% threshold
const CGFloat THRESHOLD = 0.5;
for (int index = 0; index < length; index += 4)
{
intensity = (pixelBuffer[index] + pixelBuffer[index + 1] + pixelBuffer[index + 2]) / 3. / 255.;
if (intensity > THRESHOLD) {
bw = 255;
} else {
bw = 0;
}
pixelBuffer[index] = bw;


pixelBuffer[index + 1] = bw;
pixelBuffer[index + 2] = bw;
}

CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext=CGBitmapContextCreate(pixelBuffer, originalImage.size.width, originalImage.size.height, 8, 4*originalImage.size.width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);
CFRelease(colorSpace);
free(pixelBuffer);
CGImageRef cgImage=CGBitmapContextCreateImage(bitmapContext);
CGContextRelease(bitmapContext);

UIImage *bwImage = [UIImage imageWithCGImage:cgImage];

我通过写入屏幕外上下文来获取像素数据(苹果建议的获取原始数据的新方法对我不起作用)

例如

  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

unsigned char *rawData = malloc(imageHeight * imageWidth * 4);
CGContextRef offscreenContext = CGBitmapContextCreate(rawData, imageWidth, imageHeight,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);

CGColorSpaceRelease(colorSpace);

CGContextDrawImage(offscreenContext, CGRectMake(0, 0, imageWidth, imageHeight), cgCropped);
CGContextRelease(offscreenContext);

这是获取像素数据的代码

+ (unsigned char *) getPixelData: (CGImageRef) cgCropped {

size_t imageWidth = CGImageGetWidth(cgCropped);

size_t imageHeight = CGImageGetHeight(cgCropped);
size_t bitsPerComponent = 8;
size_t bytesPerPixel = 4;
size_t bytesPerRow = bytesPerPixel * imageWidth;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

unsigned char *rawData = malloc(imageHeight * imageWidth * 4);
CGContextRef offscreenContext = CGBitmapContextCreate(rawData, imageWidth, imageHeight,
bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);

CGColorSpaceRelease(colorSpace);

CGContextDrawImage(offscreenContext, CGRectMake(0, 0, imageWidth, imageHeight), cgCropped);
CGContextRelease(offscreenContext);

return rawData;
}

关于iPhone将彩色图像转换为2位图像(黑白),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4030430/

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