【问题标题】:Getting 0 values for RGB when trying to change pixels in an CGImageRef data尝试更改 CGImageRef 数据中的像素时获取 RGB 的 0 值
【发布时间】:2010-11-24 10:26:04
【问题描述】:

大家好,我在这段代码中得到 0 的 RGB 值。知道为什么吗? 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;

}

【问题讨论】:

  • 问题已解决。没有问题 :-) 我的 RGB 值为 0,因为图像仅由 Alpha 值组成。

标签: iphone cgcontext cgimage


【解决方案1】:

好的,所以如果您在位图上的像素操作有问题,您可能需要考虑您的位图格式(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,但由于 CGImageRef (inImage) 的灰度阴影是透明的,所以存储在 alpha 位中的所有像素。

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

【讨论】:

    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2018-06-18
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多