PDA

Просмотр полной версии : decode BMP - как вытащить из массива 32 битный цвет


VitaliyKrivtsov
09.01.2011, 03:23
Здравствуйте! У меня назрел вопрос по поводу распаковывания массива байт файла BMP в BitmapData.
Почитал инфу о формате, в википедии (http://ru.wikipedia.org/wiki/BMP#BITMAPFILEHEADER.5B2.5D) хорошо расписана структура файла. Если я правильно понял BMP несжатые в которых глубина 32 бита - синий, зеленый, красный, альфа - занимают 4 байта. А вот собственно вопрос, как оптимально используя ресурсы, с читать данные отдельно для каждого канала, что бы перенести потом в BitmapData при помощи setPixel( ) ?

Wolsh
09.01.2011, 03:50
А зачем Вам отдельные каналы? Читайте 32 битный уинт ( ByteArray#readUnsignedInt() ) и пишите его в битмапдату.
Если честно, ни разу не встречал .bmp с 32 битами без сжатия. Разве что в иконках.

Obi
09.01.2011, 03:50
Эм, непонятно, а чем Loader.load() не подходит? Он вам загрузит картинку, потом вы возьмете оттуда битмапдату и попиксельно ее распотрошите. r: color >> 16 & 0xFF, g: color >> 8 & 0xFF, b: color & 0xFF.

Wolsh
09.01.2011, 04:16
Obi, Loader не понимает BMP. И товарищу не надо никого потрошить, ему надо BitmapData.

TERRORist
09.01.2011, 14:45
будет очень медленно работать, если попиксельно и большие картинки. Если есть возможность, юзайте PNG с альфа каналом. Каналы после отрисовки ега в битмапдату разделяются методом CopyChannel

VitaliyKrivtsov
09.01.2011, 18:44
Wolsh, такие .bmp с 32 битами на пиксель есть, они не сжимаются по умолчанию, так было разработчиками этого формата задумано, сжимаются те .bmp которые ниже 24 бит на пиксель.
TERRORist, мне нужно BitmapData то есть само изображение, я имел ввиду, что разобрать по каналу - значить выделить каждый канал из массива байт (красный, зеленый, синий ) и впихнуть в BitmapData, не на оборот.

Wolsh
09.01.2011, 19:54
сжимаются те .bmp которые ниже 24 бит на пиксель.Ниже 24 бит - это 8 бит, то есть 256 цветов, индексированное изображение. Никто его не сжимает, нет смысла. Смысл сжимать есть как раз для 32 бит, так как вес уже ощутимый.
Я разбирал bmp, когда делал "читалку" файла ICO. Там действительно не сжимается 32 бита для маленьких размеров. Но, например, "vista icon" содержит бмп-файл с PNG сжатием (в спецификации BMP возможен также и JPG, но в иконках он бессмысленен). Спецификация также предусматривает изображение с 16 бит на пиксель - я не смог найти или создать в редакторах ни одного примера такого изображения, они может и были в эпоху виндос 3, а может и в миллениуме)) Вобщем мой класс читает все, но только не 16 бит. Если хотите - поделюсь (впрочем бмп-читалки можно найти в разных библиотеках). Что касается 32-бит бмп, то там действительно все просто, блок имеджДата и есть битмапдата (единственно он может быть зеркально перевернут по вертикали), 32-битный паддинг строк развертки делать не надо, данные итак 32 бита, то есть просто читаем их подряд и задаем битмапдате setPixel32() в двойном цикле ширина/высота.

VitaliyKrivtsov
09.01.2011, 20:54
Поюзал гугл , нашол класс который разбирает все возможные .bmp, но нет класса который запихивал бы в массив байт, что б потом, например, сохранить изображение у себя на компу, не найду и хорошей документации, Wolsh может посоветуешь ту документацию по которой сам разбирал bmp.

Wolsh
09.01.2011, 21:16
http://pascal.sources.ru/articles/099.htm
MSDN:
http://msdn.microsoft.com/en-us/library/dd183562%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/dd183374%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/dd183376%28VS.85%29.aspx
AS3 BMPDecoder :
http://ntt.cc/2008/10/01/using-bmpdecoder-class-to-load-an-external-bmp-file-rle-compression-support.html

нет класса который запихивал бы в массив байт - в смысле создавал файл BMP из имеющейся битмапдаты, то есть BMP Encoder?

VitaliyKrivtsov
09.01.2011, 21:23
да, такой себе класс BMPEncoder, конечно его сложнее будет написать чем класс Decoder который только разбирает.