Bmp-Comments | jenyay.net

Bmp-Comments

 06.12.2007 - 18:17

confused smiley

 24.02.2008 - 20:25

как это вы додумались до этого?

Jenyay 25.02.2008 - 19:23

До чего именно?

Хорош_гусь)) 26.02.2008 - 22:18

Big Endian - Small Endian

Надо ещё учесть то, что все числа лежат в формате Big Endian, т.е. байты местами переставлены! Я до этого долго доходил!

Сергей 11.07.2008 - 17:00

программы для открытия структуры файла BMP

Здравствуйте подскажите какие программы позволяют открывать структуру любого файла BMP (с просмотром кода каждого пикселя)?

Фосса 05.11.2008 - 12:15

Little Endian!

Таки данные представлены в формате Little Endian, то есть младшим байтом-вперёд }=

Den 08.01.2009 - 13:04

Так если это взято из MSDN, тогда почему другие графические редакторы не могут открыть файл в этом формате????????

Jenyay 08.01.2009 - 17:32

Какой файл?

amarant555 13.02.2009 - 15:04

пробовал на делфи работать с файлом созданым фотожоп >16 бит не воспринимает видимо там 5-5-5 вместо 5-6-5 (с которым умеет работать делфи) кому не трудно можете проверить прав я или нет.

amarant555 13.02.2009 - 15:07

поправка вернее делфи работает с файлом 16 бит но воспринимает формат как кастом, при этом не возможно использовать ряд функций.

PanzerDogg 22.02.2009 - 22:55

GOOD!!!

 26.02.2009 - 09:43

confused smileyangry smiley

 10.05.2009 - 17:50

Мне очень понравилось содержание, но все же стоит сделать текст доступным не только для программистов, или студентов-программистов. Почему не сделать эту статью более выразительной и доступной

Jenyay 10.05.2009 - 17:57

Просто интересно, а кому может понадобиться описание формата файла кроме программистов?

DiezAver 16.05.2009 - 11:18

мне вот очень интересно, а в этом месте:

 // Пишем мусор для выравнивания
         WriteFile (hOut, Palette, Width % 4, &RW, NULL);
         SetFilePointer (hIn, (3 * Width) % 4, NULL, FILE_CURRENT);

пишется мусор размером Width % 4. При размере картинки, скажем 255, Width % 4 будет = 3, но разве записать надо не на 1 байт?

Jenyay 16.05.2009 - 11:23

Нет, нужно писать не один байт, потому что один пиксель занимает три байта. Если бы картинка была 8-битовая, а не 24-битовой, то достаточно было бы одного байта.

DiezAver 19.05.2009 - 09:01

О, действительно, просто я как раз с 8-битовыми сейчас работаю

Влад 01.06.2009 - 19:08

Проблема с чтением палитры

Я создал 256-цветный рисунок в стандартном Paint'е. В програме загрузил рисунок и палитру, но цвета отображаются неправильно(нету оттенков красного). Так загружаю палитру:

for(int i=0; i<256; i++){
    fin.get(color.blue);
    fin.get(color.green);
    fin.get(color.red);
    fin.get(reserved);
    setPaletteRegistr(i, &color);
  }

daim 31.07.2009 - 08:10

такой вот глупый вопросец: с 24 бит на пиксель понятно допустим белый - FF FF FF читаем каждый канал и записываем В свои байтные переменные а с 16 бит на пиксель как? тотже белый FF 7F FF? как то через маску....? и размер параграфа то же будьте добры, просто первый раз здесь услышал

Джей 13.11.2009 - 17:04

"...есть надписи на русском языке"

> "BitMaP - битовая карта, или, говоря по-русски, битовый массив" Вообще-то слово "массив" - французского происхождения (massif от massiz). Но это мелочи. Я тут чеек посторонний, просветите: што за язык чудной вы используете для программ своих написания? Уж не Си ли это?

Jenyay 13.11.2009 - 17:11

Джей

Да, Си, но тут не столько сам язык, сколько вызовы функций WinAPI, от самого языка не так много осталось :)

Джей 17.11.2009 - 10:51

Si, si...

Я щас пишу на C# (уж больно заказчик формы любит...). Какую среду разработки посоветуете?

Jenyay 17.11.2009 - 10:55

Visual C# Express, если не хочется денег на среду тратить.

Джей 17.11.2009 - 11:28

Ah, bien merci, merci bien...

Mille mercis... З.ы. source: "Распространенье наше по планете / Особенно заметно вдалеке. / В общественном парижском туалете / Есть надписи на русском языке" (В.С. Высоцкий)

Джей 17.11.2009 - 17:32

mille pardons

Je m'excuse de vous demander pardon... Вы в ЦОИз шарите? Если да, в чём именно?

Jenyay 30.11.2009 - 22:26

В ЦОИ скорее теоретически представляю что к чему. А вообще по работе я иногда занимаюсь обработкой несколько специфических изображений (радиоизображений).

Людмила 17.01.2010 - 18:44

Очень важная для меня, интересная информация. Большое спасибо. Удачи, здоровья.

murder 07.04.2010 - 13:52

16-битные изображения

По моим наблюдениям Photoshop не использует поле biClrUsed.

Алгоритм такой: Если поле biCompression равно BI_RGB то формат 5:5:5. Если же это поле содержит BI_BITFIELDS, то цвета нужно считывать согласно маскам bV5RedMask, bV5GreenMask, bV5BlueMask.

Кроме того BI_BITFIELDS в сочетании с масками позволяет менять расположение цветов (например RGB вместо стандартного BGR). Я проверял это на функции SetDIBitsToDevice - работает.

Domen0 25.05.2010 - 12:08

Огромное спасибо! Наконец-то нашел.grinning smiley

Винт 01.09.2010 - 18:27

маленькая поправочка для концовки ...

     delete[] inBuf;
     delete[] outBuf;

 25.09.2010 - 20:07

shrieking smileyconfused smileyfrowning smileyangry smiley

 01.10.2010 - 18:14

shrieking smileyshrieking smileyshrieking smileyshrieking smileyshrieking smileyshrieking smileyshrieking smileyshrieking smiley

)))) 21.12.2010 - 05:54

confused smileyangry smileyshrieking smiley

 14.01.2011 - 20:55

здесь никто ни чего не знает

Ротва 18.01.2011 - 02:09

Амет

Написал собственную прогу по этой статье. Спасибо. Проверил все варианты, за исключением 5-5-5, 5-6-5. Если у кого-то есть изображения с таким форматом и БЕЗ сжатия, очень прошу выложить на http://pixs.ru/ и скинуть линк сюда! thx!

апт 12.03.2011 - 11:01

врт

куgrinning smiley

Duk Nukem 27.10.2011 - 20:43

Ошибка в программе

Ваша программа при компиляции выдаёт ошибку в строке:

hFile = CreateFile (fname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);

fname неправильного типа.Как исправить это?

Jenyay 29.10.2011 - 09:47

Попробовал сейчас скомпилировать исходник в Visual C++ 2008 Express, все скомпилировалось. А у Вас каком компилятор?

eugrita 27.12.2011 - 05:41

создание BMP

у меня ваша программа создала BMP-файл, но просмотр его оказался недоступен. Почему??? (Win XP)

eugrita 27.12.2011 - 05:43

cоздание BMP

При попытке открытия Paint говорит что недостаточно ресурсов для выполнения операции

Slavon G. 11.01.2012 - 02:26

re: создание BMP

eugrita, тяжело что-то сказать, не видя кода программы Jenyay, а вот тут ошибочкаhappy smiley //Convert256To24() bfh.bfSize = bfh.bfOffBits + 3 * Width * Height + Height * (Width % 4);

Slavon G 11.01.2012 - 02:29

re: создание BMP

Поэтому в последний рисунок, размер файла записывается в заголовок неправильно.

PS: каптча любит шестеркиshrieking smiley

mao 12.08.2012 - 14:55

А сколько здесь байт в LONG? что-то я смотрю в редакторе одну бмп-картинку и похоже на то, что 4, но в чём тогда отличие от dword?

mao 12.08.2012 - 15:24

А, википедия популярно объясняет, что « Тип WORD должен иметь размер 16 бит, типы DWORD и LONG — 32 бита, тип LONG — знаковый, порядок байтов подразумевается little endian. »

Касательно этого два вопроса: 1) зачем знаковость в biWidth и biHeight? 2) little endian везде или только в long?

mitas 24.11.2012 - 15:01

вопросик.

Всем доброе время суток. Хочу сказать автору спасибо, все изложено очень наглядно и понятно. Есть только один вопрос. Он касается примера 1-го, а именно подсчет размера конечного файла. bfh.bfSize = bfh.bfOffBits + sizeof(color) * Width * Height +  Вопрос к этой формуле.

         Height * ((sizeof(color) * Width) % 4  это так называемая проверка на кратность.

bfh.bfOffBits - размер в байт sizeof(color) - размер в байт Width * Height - а тут размер в битах Нету ли здесь ошибки в подсчете ??? Предположим есть bmp картинка 256x256пик. С глубиной цвета 24бит. По факту ее размер 196662 байта или 1572864 бит. Проверяем: bfh.bfOffBits = 14 + 40 = 54 байт + sizeof(color) = 3 бита(24 байт) * Width * Height = 256 * 256 = 65636 бит Сложим по формуле: 1. (54 байт + (24бита + 65636 бит)) 2. (54 байт + 1572864 бит)  пот и сам вопрос как ? 3. (= 1572918 бит \ 8 = 196614,75 байт) а должны получить (196662 байта) 4. Я так понимаю 54 байта нужно + к (1572864 бит / 8 = 196608 бита) = 196662 байта

h21 16.10.2013 - 11:20

Компилировал на GCC, язык C++ . Во-первых, нужно заменить названия типов данных: WORD - unsigned short DWORD - unsigned int LONG - int или long

Во-вторых, размер структуры в памяти зависит от настроек компилятора и от директив. Поля структуры выравниваются кратно своему размеру: 1-байтовые поля не выравниваются, 2-байтовые — выравниваются на чётные позиции, 4-байтовые — на позиции кратные четырём и т.д.. Таким образом, в памяти остаются пустые места между полями структуры, при этом, соответственно, она запишется в файл вместе с ними. Чтобы поля размещались без пропусков, следует указывать следующие директивы:

  1. pragma pack(push, 1)

// Объявление структур ...

  1. pragma pack(pop)

Структуры должны иметь следующие размеры: BITMAPFILEHEADER - 14 байтов BITMAPINFOHEADER - 40 байтов

h21 16.10.2013 - 11:38

В предыдущем сообщении, не пойму, откуда взялись единицы перед директивами, вместо # (октоторп).

  1. pragma pack(push, 1)

// Объявление структур ...

  1. pragma pack(pop)

Борис 31.12.2013 - 15:03

Пиксели

Подскажите frowning smiley, вот я записал сами байты изображения в массив , как перевести их в целые числа(для цвета) , 0 до 15 . Плиз?

Борис 31.12.2013 - 15:04

mas=(unsigned char *)malloc(sizeof(unsigned char)*(inf.biSizeImage));

fseek(fp, bmp.bfOffBits, SEEK_SET); fread(mas, inf.biSizeImage, 1, fp) Вот конкретно , а что дальше можно сделать?confused smiley НА чистом СИ

I.D. 09.01.2014 - 15:52

Хорошая статья happy smiley

Прохожий 27.01.2014 - 13:32

Представление чисел в памяти и регистрах

Хорошая статья. Числа в памяти записаны справа налево (т.е. о рег AX 2233h Число в памяти 3322h (после записи) рег EAX 22334455h Число в памяти 55443322h

Серж 25.05.2014 - 01:36

Мегаспасибо

Никак не мог понять, почему у меня не получается сохранить 8-битный массив с камеры размером 1625x1234 в бмп-файл. Хотя 1624x1234 сохраняется без проблем. Все заработало как только я добавил в файл дополнительно нули в количестве - как вы указали - "(3 * Width) % 4" (для 8 бит) Огромное Вам спасибо!

девочка, совершившая ошибку в своей жизни 27.10.2014 - 21:54

Помощь, мне нужна помощь, ребятки!

Я сохранила рисунок, который я очень долго и старательно рисовала в графическом редакторе-Paint. Так вот, этот рисунок имеет очень хорошую чёткость в Painte, но когда я его сохраняла, получается, что картинка не имеет такой же четкости, когда была рисунком. А совершила я ошибку в том, что сохранила рисунок в "256-цветный рисунок (*.bmp*;.did)" и сейчас он поменял цвета, а изначально он был у меня в формате *.png. Это очень плохо для меня. Прошу, помогите пожалуйста мне вернуть обратно цвет рисунку, который был раньше, и сделать так, чтобы при сохранении рисунка, картинка получалась такой же четкой, как и рисунок, если это возможно.

Jenyay 27.10.2014 - 22:37

Из испорченного рисунка получить качественный уже не получится, а в принципе Paint должен уметь сохранять png.

 11.02.2015 - 15:33

поправьте комменты плиз

>bih.biBitCount =8;// 16 бит на пиксель

 11.02.2015 - 15:37

можете пожалуйста подсказать с конвертированием 24-битного в 8-битный, а именно как посоветуете распределять цвета. вот у вас есть пример 8 битной с использования палитры, так, а вот есть у нас 3 байта, для кодирования R, G и B, вот как правильно преобразовать в индекс цвета в таблице...

Vlad K 02.03.2015 - 10:25

Обратная задача

У меня обратная задача. Нужно оцифровать график с картинки от BMP 8-бит от Paint(к примеру). Подскажите, с чего начать? Спасибо

ДмитрийК 12.02.2016 - 20:59

Автор, вы большой молодец, большое спасибо вам.

Georgy Sviridov 28.06.2019 - 17:20

Спасибо, быстро разобрался.

oss 14.09.2019 - 14:49

Спасибо большое за статью!

Иван Иванов 11.12.2019 - 10:53

Много полезна статия. Благодаря!

Виктор 01.03.2021 - 12:24

Тема

Параграф это 4 байта ? Если так, то формула расчета для добавление недостающих байтов в строку будет такой, для 24 битового формата: 4 - (Width*3 mod 4)

Виктор 01.03.2021 - 12:24

Тема

Параграф это 4 байта ? Если так, то формула расчета для добавление недостающих байтов в строку будет такой, для 24 битового формата: 4 - (Width*3 mod 4)

Виктор 01.03.2021 - 12:25

Тема

Параграф это 4 байта ? Если так, то формула расчета для добавление недостающих байтов в строку будет такой, для 24 битового формата: 4 - (Width*3 mod 4)