iOS 加载 16bit 单 channel 图像

标签 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

如您所见,图像的开头似乎有问题(是否尝试使用 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

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

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

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

关于iOS 加载 16bit 单 channel 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33067015/

相关文章:

java - 如何在不使用任何库的情况下用Java创建图形对象?

ios - Swift - UIImageview URL 幻灯片

ios - 通过 becomeFirstResponder 将焦点分配给 UISearchController 的 UISearchBar 时,键盘不出现

ios - 如何使用#selector 函数传递变量?以及将什么传递给 textField : UITextField?

c++ - 图像从 24 bpp 格式转换为 16 bpp 格式

math - 绘制旋转矩形

ios - 即使忽略 SIGPIPE 信号,IOS 6.0 上也会出现 SIGPIPE 错误

ios - Swift 2 ios 9 提示 http 即使我使用 https 连接到 amazon s3

python - 如何在pygame中根据鼠标 Action 绘制矩形

c++ - 生成不完整的迭代函数系统