在 c# (Unity) 中解码 16 位单通道 png
Decoding a 16 bit one channel png in c# (Unity)
我在 Unity 中尝试解码 16 位 1 通道 png 已经被困了一个星期。图像采用字节数组的形式,需要对其进行解码才能访问各个像素值。该图像是深度图像,其中每个像素都包含一个深度度量。
我无法使用 Unity 的 Texture2d.loadImage(),因为出于某种原因它会自动将格式更改为 RGBA24。我还查看了 opencv 插件,但它不是免费的,因此不是一个选项。我无法使用 .NET 框架中的 System.Windows.Media.Imaging.PngBitmapDecoder,因为 我的平台是 Ubuntu。
我没有 .NET ide,我通过 Unity 使用 MonoDevelop。
希望大家帮帮忙! :)
您可以使用 ImageMagick 或 GraphicsMagick 将图像从 PNG 转换为 PGM,然后从那里开始。 PGM 易于使用,仅包含一个简单的 header 和 "P2 width height maxval" 后跟 top-left 到 bottom-right 顺序中的像素:
# Make a 4x4 test image with 16-bit grayscale pixels
im7q16magick gradient:[4x4] -depth 16 g16.png
# Convert it to PGM format
im7q16magick g16.png -compress none g16.pgm
# Print it out
cat g16.pgm
P2
4 4
65535
65535 65535 65535 65535
49151 49151 49151 49151
32768 32768 32768 32768
16384 16384 16384 16384
问题是 png 图像有 12 个字节的垃圾,我必须在删除它们之前将其删除。 Texture2d.loadImage() 完成后工作。有问题的图像通过 Unity 中的 ROSBridgeLib 作为 CompressedImage 消息来自 ROS。感谢您的帮助:)
我在 Unity 中尝试解码 16 位 1 通道 png 已经被困了一个星期。图像采用字节数组的形式,需要对其进行解码才能访问各个像素值。该图像是深度图像,其中每个像素都包含一个深度度量。
我无法使用 Unity 的 Texture2d.loadImage(),因为出于某种原因它会自动将格式更改为 RGBA24。我还查看了 opencv 插件,但它不是免费的,因此不是一个选项。我无法使用 .NET 框架中的 System.Windows.Media.Imaging.PngBitmapDecoder,因为 我的平台是 Ubuntu。
我没有 .NET ide,我通过 Unity 使用 MonoDevelop。
希望大家帮帮忙! :)
您可以使用 ImageMagick 或 GraphicsMagick 将图像从 PNG 转换为 PGM,然后从那里开始。 PGM 易于使用,仅包含一个简单的 header 和 "P2 width height maxval" 后跟 top-left 到 bottom-right 顺序中的像素:
# Make a 4x4 test image with 16-bit grayscale pixels
im7q16magick gradient:[4x4] -depth 16 g16.png
# Convert it to PGM format
im7q16magick g16.png -compress none g16.pgm
# Print it out
cat g16.pgm
P2
4 4
65535
65535 65535 65535 65535
49151 49151 49151 49151
32768 32768 32768 32768
16384 16384 16384 16384
问题是 png 图像有 12 个字节的垃圾,我必须在删除它们之前将其删除。 Texture2d.loadImage() 完成后工作。有问题的图像通过 Unity 中的 ROSBridgeLib 作为 CompressedImage 消息来自 ROS。感谢您的帮助:)