为什么带有标准BMP位数据的iphone CGImageCreate会产生错误的结果?

时间:2009-04-16 09:07:55

标签: iphone core-graphics

我有一个导致标准bmp位流的gdi引擎,现在我想通过iphone中的CG显示它,我这样使用它:

// size  -> image size 
// rect  -> current view rect
// pBits -> the BITMAPINFO image bits stream

long imgSizePerRow = ((long)(24 * size.width + 31) / 32) * 4;
CGDataProviderRef providerRef = CGDataProviderCreateWithData(NULL, pBits,
                                          imgSizePerRow * size.height, NULL);

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();

CGImageRef imageRef = CGImageCreate(size.width, size.height, 8, 24,
                                    imgSizePerRow, colorSpaceRef,
                                    kCGBitmapByteOrderDefault, providerRef,
                                    NULL, YES, kCGRenderingIntentDefault);

CGContextDrawImage(context, rect, imageRef);

CGImageRelease(imageRef);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(providerRef);
注意:我检查行像素是否符合4的时间

我的gdi生成比特流,在这种情况下,R8G8B8格式,没有alpha通道,我将它用于CGDataProviderRef并将CGImage绘制到我的视图中。 奇怪的是,图像的颜色似乎发生了变化,但整个形状看起来还不错,我之前通过BITMAP FORMAT将比特流保存到文件中,然后进行对比,一切看起来都不错,只是整个颜色空间。

任何人都可以告诉我代码中的错误在哪里,或者我错过了一些段落。设置?

2 个答案:

答案 0 :(得分:3)

CGImageCreate采用原始像素,而.bmp文件不是(它具有“BITMAPINFO”标题)。相反,使用.bmp数据创建一个UIImage,然后从该对象获取CGImage。

答案 1 :(得分:1)

我错过了重点:我的GDI位图流按B8-> G8-> R8排序。