我有一个 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
如您所见,图像的开头似乎有问题(是否尝试使用 header 中的字节数据?),并且图像偏移了大约五分之一(有点难看,看左右,右边五分之一处有一条淡淡的线。
我的目标是将其转换为金属纹理并从那里使用它。那里也有问题。看起来像是一个字节顺序问题,但也许我们可以回到那个问题上。
戴夫
最佳答案
CGDataProvider
不知道它存储的数据的格式。它只是用于处理通用数据:
"The CGDataProvider header file declares a data type that supplies Quartz functions with data. Data provider objects abstract the data-access task and eliminate the need for applications to manage data through a raw memory buffer."
因为CGDataProvider
是通用的,您必须使用 CGImageCreate
提供图像数据的格式参数。 PNG 和 JPG 都有自己的 CGImageCreateWith..
用于处理编码数据的函数。
示例中的 CGImage 参数正确描述了 16 位灰度原始字节格式,但没有描述 TIF 编码,因此我猜您正确地猜测您看到的损坏像素来自文件头。
可能还有其他方法可以在 iOS 上加载 16 位灰度图像,但要使用该方法(或非常相似的 Metal 方法),您需要解析 TIF 文件中的图像字节并将其传递到函数中,或者创建另一种方式来存储和解析图像数据。
关于iOS 加载 16bit 单 channel 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33067015/