2016-11-23 1 views
0

Я застрял в течение недели, пытаясь декодировать 16-разрядный 1-канальный png в Unity. Изображение находится в форме массива байтов, который необходимо декодировать для доступа к отдельным значениям пикселей. Изображение представляет собой изображение глубины, где каждый пиксель содержит меру глубины.Декодирование 16-битного одного канала png в C# (единство)

Я не могу использовать Unity's Texture2d.loadImage(), так как по какой-то причине он автоматически меняет формат на RGBA24. Я также посмотрел плагин opencv, но он несвободен и, следовательно, не является вариантом. Я не могу использовать System.Windows.Media.Imaging.PngBitmapDecoder из платформы .NET с моей платформой является Ubuntu.

У меня нет .NET ide, я использую MonoDevelop через Unity.

Надеюсь, вы, ребята, можете помочь! :)

+0

Вы можете попробовать с https://github.com/leonbloy/pngcs – leonbloy

ответ

0

Проблема заключалась в том, что PNG изображения имели 12 байт мусора, который я должен был удалить, прежде чем их можно было удалить. Texture2d.loadImage() работал после этого. Изображение, о котором идет речь, появилось из ROS в виде сообщения CompressedImage через ROSBridgeLib в Unity. Спасибо за помощь :)

1

Вы можете использовать ImageMagick или GraphicsMagick для преобразования изображения из PNG в PGM и перейти оттуда. PGM легко работать, содержащие только простой заголовок с «P2 ширина высота MAXVAL», а затем пикселей в верхнем левом углу, чтобы нижний правый порядке:

# 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 
Смежные вопросы