gpt4 book ai didi

iphone - 尝试更改 CGImageRef 数据中的像素时获取 RGB 0 值

转载 作者:行者123 更新时间:2023-12-03 21:21:22 28 4
gpt4 key购买 nike

大家好,我在这段代码中得到的 RGB 值是 0。知道为什么吗? inImage 是使用此 CGContext 创建的。

-(CGContextRef)createBitmapContextWide:(int) pixelsWide Height:(int) pixelsHigh{

CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;

bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);

colorSpace = CGColorSpaceCreateDeviceRGB();
bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL)
{
fprintf (stderr, "Memory not allocated!");
return NULL;
}
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast);
if (context== NULL)
{
free (bitmapData);
fprintf (stderr, "Context not created!");
return NULL;
}
CGColorSpaceRelease( colorSpace );

return context;

}

更改像素颜色(或者应该更改)的代码

-(UIImage*)convertGrayScaleImageRedImage:(CGImageRef)inImage{

CFDataRef m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage));
UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef);

int length = CFDataGetLength(m_DataRef);

for (int i=0; i<length; i+=4){

int r = i;
int g = i+1;
int b = i+2;
//int a = i+3;//alpha

NSLog(@"r=%i, g=%i, b=%i",m_PixelBuf[r], m_PixelBuf[g], m_PixelBuf[b]);



m_PixelBuf[r] = 1;
m_PixelBuf[g] = 0;
m_PixelBuf[b] = 0;
//m_PixelBuf[a] = m_PixelBuf[a];//alpha
}

CGContextRef ctx = CGBitmapContextCreate(m_PixelBuf,
CGImageGetWidth(inImage),
CGImageGetHeight(inImage),
CGImageGetBitsPerComponent(inImage),
CGImageGetBytesPerRow(inImage),
CGImageGetColorSpace(inImage),
CGImageGetBitmapInfo(inImage)
);

CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
CGContextRelease(ctx);
UIImage *redImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);

return redImage;

}

最佳答案

好的,如果您在位图上进行像素操作时遇到问题,您可能需要考虑您的位图格式(32 位?16 位?)ARGB or RGBA or CMYK

提示:如果您想检查位图的格式,请尝试为第一个字节输入 1,为第二个字节输入 0,为第三个字节输入 0。

m_PixelBuf[i] = 1;
m_PixelBuf[i+1] = 0;
m_PixelBuf[i+2] = 0;

这样,如果所有像素都变成红色,您就知道您的格式是 RGBA。尝试一下,几分钟之内你就会明白了。可能有更简单的方法,但我是菜鸟:-)

在我的例子中,我的图像是 RGBA,但所有像素都存储在 alpha 位中,因为 CGImageRef (inImage) 是透明的,带有灰度阴影。

结论
代码是正确的,但我对输入位图格式的了解是错误的。

关于iphone - 尝试更改 CGImageRef 数据中的像素时获取 RGB 0 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4265725/

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