gpt4 book ai didi

objective-c - 使用 CGImageCreate 的 32 位/组件图像实际上只有 8 位/组件

转载 作者:行者123 更新时间:2023-12-03 17:06:50 24 4
gpt4 key购买 nike

在过去的 4 到 5 个小时里,我一直在努力解决这个非常奇怪的问题。我有一个字节数组,其中包含我想要制作图像的像素值。该数组代表每个组件 32 位的值。没有 Alpha channel ,因此图像为 96 位/像素。

我已将所有这些指定给 CGImageCreate 函数,如下所示:

  CGImageRef img = CGImageCreate(width, height, 32, 96, bytesPerRow, space, kCGImageAlphaNone , provider, NULL, NO, kCGRenderingIntentDefault);

bytesPerRow 为3*宽度*4。之所以如此,是因为每个像素有 3 个分量,每个分量占用 4 个字节(32 位)。因此,每行的总字节数为 3*4*宽度。数据提供者定义如下:

     CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,bitmapData,3*4*width*height,NULL);

这就是事情变得奇怪的地方。在我的数组中,我明确将值设置为 0x000000FF(对于所有 3 个 channel ),但图像却完全是白色的。如果我将该值设置为 0xFFFFFF00,图像将显示为黑色。这告诉我,由于某种原因,程序没有读取每个组件的所有 4 个字节,而是读取最低有效字节。我尝试过各种组合 - 甚至包括 Alpha channel ,但它对此没有任何影响。

程序对此视而不见:0xAAAAAA00。它只是将其读取为 0。当我明确指定每个组件的位为 32 位时,函数不应该考虑到这一点并实际从数组中读取 4 个字节吗?

字节数组定义为:bitmapData = (char*)malloc(bytesPerRow*height); 我将按如下方式为数组分配值

 for(i=0;i<width*height;i++)
{
*((unsigned int *)(bitmapData + 12*i + 0)) = 0xFFFFFF00;
*((unsigned int *)(bitmapData + 12*i + 4)) = 0xFFFFFF00;
*((unsigned int *)(bitmapData + 12*i + 8)) = 0xFFFFFF00;
}

请注意,我将数组作为 int 进行寻址,以寻址 4 个字节的内存。 i 乘以 12,因为每个像素有 12 个字节。 4 和 8 的相加允许循环寻址绿色和蓝色 channel 。请注意,我已经检查了调试器中数组的内存,这似乎完全没问题。循环正在写入 4 个字节。任何类型的指向这将是最有帮助的。我的最终目标是能够读取 32 位 FITS 文件 - 我已经为此编写了程序。我只是用上面的数组测试上面的代码。

如果重要的话,这里是完整的代码。这是我的自定义 View 的 drawRect:(NSRect)dirtyRect 方法:

int width, height, bytesPerRow;
int i;

width = 256;
height = 256;
bytesPerRow = 3*width*4;

char *bitmapData;
bitmapData = (char*)malloc(bytesPerRow*height);
for(i=0;i<width*height;i++)
{
*((unsigned int *)(bitmapData + 12*i + 0)) = 0xFFFFFF00;
*((unsigned int *)(bitmapData + 12*i + 4)) = 0xFFFFFF00;
*((unsigned int *)(bitmapData + 12*i + 8)) = 0xFFFFFF00;
}
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,bitmapData,3*4*width*height,NULL);
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();

CGImageRef img = CGImageCreate(width, height, 32, 96, bytesPerRow, space, kCGImageAlphaNone, provider, NULL, NO, kCGRenderingIntentDefault);

CGColorSpaceRelease(space);
CGDataProviderRelease(provider);

CGContextRef theContext = [[NSGraphicsContext currentContext] graphicsPort];
CGContextDrawImage(theContext, CGRectMake(0,0,width,height), img);

最佳答案

我看到一些值得指出的事情:

一、Quartz 2D编程指南doesn't list 96-bpp RGB 作为受支持的格式。您可以尝试 128-bpp RGB。

其次,您正在使用小端系统*,这意味着 LSB 优先。将每个组件设置的值更改为 0x33000000EE,您将看到浅灰色 (EE),而不是深灰色 (33) .

最重要的是,bbum 指出您的显示器无法渲染该范围的颜色**是绝对正确的。为了显示,它被压缩到 8-bpc。如果它在内存中是正确的,那么它在内存中也是正确的。

<小时/>

*:更多的是遗憾。 R.I.P PPC。

**:也许 NASA 有一个可以做到的?

关于objective-c - 使用 CGImageCreate 的 32 位/组件图像实际上只有 8 位/组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5494535/

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