为啥使用标准 BMP 位数据的 iphone CGImageCreate 会给出错误的结果?

Posted

技术标签:

【中文标题】为啥使用标准 BMP 位数据的 iphone CGImageCreate 会给出错误的结果?【英文标题】:Why does the iphone CGImageCreate with data from standard BMP bits give the wrong result?为什么使用标准 BMP 位数据的 iphone CGImageCreate 会给出错误的结果? 【发布时间】:2009-04-16 09:07:54 【问题描述】:

我有一个生成标准 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把比特流保存到一个文件里,对比一下,整个颜色空间看起来都还可以。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

嗨,彼得。实际上我使用位图的原始像素,只使用“BTIMAPINFO”标头来设置参数(我不从标头信息构造 CGImage)? 假设在位图数据之后 没有备用数据,我接下来要看的是算术。在这种情况下,我怀疑您的 imgSizePerRow 计算。为什么是 (+31)/32 舞蹈?为什么不直接乘以四?【参考方案2】:

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

【讨论】:

那么您对代码进行了哪些更改以使其正常工作?

以上是关于为啥使用标准 BMP 位数据的 iphone CGImageCreate 会给出错误的结果?的主要内容,如果未能解决你的问题,请参考以下文章

cg数据类型

为啥bmp文件的实际大小与我计算的不同?

cg数据类型

C++如何把位图保存到数组中

为啥在 64 位 5s iPhone 上安装时应用程序会卡住

仅此一次对BMP文件做详细分析的机会,想了解的朋友千万不能错过