Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用CGImageCreate的32位/组件图像实际上只有8位/组件_Objective C_Cocoa_Core Graphics_Quartz Graphics - Fatal编程技术网

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

Objective c 使用CGImageCreate的32位/组件图像实际上只有8位/组件,objective-c,cocoa,core-graphics,quartz-graphics,Objective C,Cocoa,Core Graphics,Quartz Graphics,在过去的4到5个小时里,我一直在努力解决这个非常奇怪的问题。我有一个包含像素值的字节数组,我想从中生成一个图像。该数组表示每个组件32位的值。没有Alpha通道,因此图像为96位/像素 我已将所有这些指定给CGImageCreate函数,如下所示: CGImageRef img = CGImageCreate(width, height, 32, 96, bytesPerRow, space, kCGImageAlphaNone , provider, NULL, NO, kCGRender

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

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

  CGImageRef img = CGImageCreate(width, height, 32, 96, bytesPerRow, space, kCGImageAlphaNone , provider, NULL, NO, kCGRenderingIntentDefault);
     CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,bitmapData,3*4*width*height,NULL);
bytesPerRow是
3*width*4
。这是因为每个像素有3个组件,每个组件需要4个字节(32位)。因此,每行的总字节数是3*4*width。数据提供程序的定义如下:

  CGImageRef img = CGImageCreate(width, height, 32, 96, bytesPerRow, space, kCGImageAlphaNone , provider, NULL, NO, kCGRenderingIntentDefault);
     CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,bitmapData,3*4*width*height,NULL);
这就是事情变得奇怪的地方。在我的数组中,我明确地将值设置为0x000000FF(对于所有3个通道),但图像显示为完全白色。如果我将该值设置为0xFFFF00,则图像显示为黑色。这告诉我,出于某种原因,程序没有读取每个组件的所有4个字节,而是读取最低有效字节。我尝试过各种组合,甚至包括阿尔法通道,但这并没有什么不同

程序对此视而不见:0xAA00。它只是将其读取为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;
}

我认为有几点值得指出:

首先,Quartz 2D编程指南96 bpp RGB作为支持的格式。您可以尝试128 bpp RGB

第二,您正在使用一个小小的endian系统*,这意味着LSB是第一位的。更改将每个组件设置为
0x33000000EE
的值,您将看到浅灰色(
EE
),而不是深灰色(
33

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


*:真遗憾。R.I.P PPC


**:也许美国宇航局有一个可以?

32位/组件似乎是一种相当奇怪的图像格式;你真的需要1.415*10^9864不同的颜色吗?!?!?!FITS文件格式确实指定了每个通道的32位组件,所以是的;但是你有一个可以渲染这么多颜色的设备吗?(可以给我吗?)如果CoreGraphics在某个地方有一个截止点,我不会感到惊讶。尝试16位/组件和24位/组件。从一些简单的工作开始并从那里扩展。我确实有16位/组件与NSImageBitRep一起工作。我之所以尝试CG是因为它似乎支持32位。我不认为“越多越好”,但之前我尝试用0xFFFF除以16位范围内的32位图像。这是可行的,但它与真正的16位版本之间总是存在一些差异。然而,如果我在PS中打开相同的两张图片,绝对没有区别。这可能是什么原因?我是否应该将32位图像除以0xFFFF以将其缩小到16位范围?这不是正确的方法吗?谢谢。不管它值多少钱,我确实有16位与NSImageBitRep一起工作。我理解以8位显示所有内容的意义,但是,如何准确地以8位甚至16位显示32位图像?我之前采用的一种方法是将整个图像除以0xFFFF。这带来了一个16位范围内的32位图像,我能够显示而无需剪辑。但是,如果我以前将文件保存为16位,亮度总是会有一些差异。最好的方法是什么?如何处理16位和32位图像?@Saad:将显示颜色深度从32位减少到8位的最佳功能是什么?恐怕我一点也不知道。这听起来像是某人的信号处理论文项目(不幸的是,这不是我的专业领域)。我猜这对你的图片内容有很大的依赖性。Photoshop至少可以尝试显示,这并不让我感到惊讶(当然,当它出现在屏幕上时,你仍然会丢失信息)。网络上可能有一个开源的FITS库,你可以阅读它的位深度缩减代码。谢谢Josh。我已经在使用最先进的FITS库(CFITSIO)。你认为就这件事发布另一个问题是个好主意吗?StackOverflow允许这样做吗?@Saad:对于这个问题,你可能会得到一个更有用的答案,但是如果你的意思是问一个关于这个主题另一个特定方面的新问题(比如计算传递函数),那么它不仅是允许的,而且是正确的协议。你绝对应该把它贴出来——我认为这是一个很好的问题,我个人有兴趣阅读回复。我只建议你将新问题变得更一般,而不考虑CoreGraphics的内容,否则你会让更多像我和bbum这样的人告诉你CG的局限性。