iOS载入16bit单通道图像

时间:2015-10-11 15:57:50

标签: ios graphics

我有一个16位灰度图像。我试过.png和.tif。 .tif有点工作。我有以下代码:

CGDataProviderRef l_Img_Data_Provider = CGDataProviderCreateWithFilename( [m_Name cStringUsingEncoding:NSASCIIStringEncoding] );
CGImageRef l_CGImageRef = CGImageCreate( m_Width, m_Height, 16, 16, m_Width * 2,
                                        CGColorSpaceCreateDeviceGray(), kCGBitmapByteOrder16Big, l_Img_Data_Provider, NULL, false, kCGRenderingIntentDefault );
test_Image = [[UIImage alloc] initWithCGImage:l_CGImageRef];
[_test_Image_View setImage:test_Image];

这会产生以下图像: faulty gradient

正如你所看到的,在图像的开头似乎存在一个问题(它是否可以尝试使用标题中的字节数据?),并且图像偏移了大约五分之一(稍微难一点)看,看左边和右边,有一条距离右边大约五分之一的暗线。

我的目标是将其转换为金属质感并从那里使用它。还有问题。看起来像字节顺序问题,但也许我们可以回过头来看。

戴夫

1 个答案:

答案 0 :(得分:1)

CGDataProvider不知道它存储的数据格式。它仅用于处理通用数据:

  

" CGDataProvider头文件声明了一个提供的数据类型   Quartz函数包含数据。数据提供者对象抽象出来   数据访问任务,消除了管理应用程序的需要   数据通过原始内存缓冲区。"

CGDataProvider

由于CGDataProvider是通用的,因此您必须使用CGImageCreate参数提供图像数据的格式。 PNG和JPG有自己的CGImageCreateWith..函数来处理编码数据。

您的示例中的CGImage参数正确描述了16位灰度原始字节格式,但没有关于TIF编码的内容,因此我猜您猜测您看到的损坏像素来自文件头是正确的。

在iOS上可能还有其他方法可以加载16位灰度图像,但是要使用该方法(或非常类似的Metal方法),您需要从TIF文件中解析图像字节并将其传递给函数,或者创建另一种存储和解析图像数据的方法。