За BMP замолвите слово
Jan. 26th, 2018 07:10 pmЧто-то всё, я затупил с BMP. В прошлом посте я обнаружил "косяк" - это был 16-ти цветовой bmp, осюда вся порнуха. Но я сделал нормальный 256-цветовой bmp-файл.

Вот даже сам файл.
Сел, прочитал мануалы. Отличное описание на русском http://jenyay.net/Programming/Bmp . Есть прекрасная структура. В примере:
Сделал вывод полей структуры, вывод получаемых параметров дисплея.
Как видно разрешение фреймбуффера соответствует разрешению изображения.
Да, фреймбуффер у меня 16-ти битный, ну буду выводить в старший байт, младший буду делать нулём. Пофигу пока на цвета. Ну и пусть, что в битмапе цвет - это ячейка массива с цветами. Согласно biBitCount - это 256 цветов. Будем брать просто её номер (цвета научимся считать потом). Т.е. по идее должны получить изображение, просто другого цвета, если тупо скопировать битмап во фреймбуффер. Делаю копию.
И получаю...

ЧЯДНТ??? Меня смущает в описании один момент: И, в-третьих, как написано в [1], если размер строки растра не кратен 4, то она дополняется от 1 до 3 пустыми (нулевыми) байтами, чтобы длина строки оказалась кратна параграфу. Вот это и есть самое неприятное.
Что-то нифига не понял... Люди, кто работал с BMP - помогите. Ну почти прочитал, ну уже понимаю как считать. Почему вывести в тупую не могу? Про перевёрнутость изображения тоже понял...
UPD Решено

Вот даже сам файл.
Сел, прочитал мануалы. Отличное описание на русском http://jenyay.net/Programming/Bmp . Есть прекрасная структура. В примере:
typedef struct /**** BMP file info structure ****/
{
unsigned int biSize; /* Size of info header */
int biWidth; /* Width of image */
int biHeight; /* Height of image */
unsigned short biPlanes; /* Number of color planes */
unsigned short biBitCount; /* Number of bits per pixel */
unsigned int biCompression; /* Type of compression to use */
unsigned int biSizeImage; /* Size of image data */
int biXPelsPerMeter; /* X pixels per meter */
int biYPelsPerMeter; /* Y pixels per meter */
unsigned int biClrUsed; /* Number of colors used */
unsigned int biClrImportant; /* Number of important colors */
} BITMAPINFOHEADER;
Сделал вывод полей структуры, вывод получаемых параметров дисплея.
The framebuffer device was opened successfully. 800x480, 16bpp vinfo.xoffset=0 vinfo.bits_per_pixel/8 = 2 vinfo.yoffset = 0 finfo.line_length = 2048 The framebuffer device was mapped to memory successfully. BitmapInfo.bmiHeader.biSize = 40 BitmapInfo.bmiHeader.biWidth = 800 BitmapInfo.bmiHeader.biHeight = 480 BitmapInfo.bmiHeader.biBitCount = 8 BitmapInfo.bmiHeader.biSizeImage = 384000 BitmapInfo.bmiHeader.biXPelsPerMeter = 0 BitmapInfo.bmiHeader.biYPelsPerMeter = 0 BitmapInfo.bmiHeader.biClrUsed = 0 BitmapInfo.bmiHeader.biClrImportant = 0
Как видно разрешение фреймбуффера соответствует разрешению изображения.
Да, фреймбуффер у меня 16-ти битный, ну буду выводить в старший байт, младший буду делать нулём. Пофигу пока на цвета. Ну и пусть, что в битмапе цвет - это ячейка массива с цветами. Согласно biBitCount - это 256 цветов. Будем брать просто её номер (цвета научимся считать потом). Т.е. по идее должны получить изображение, просто другого цвета, если тупо скопировать битмап во фреймбуффер. Делаю копию.
int i;
for (i=0; i < vinfo.xres * vinfo.yres; i++) {
fbp[i * 2] = 0;
fbp[i * 2+1 ] = BitmapBits[i];
}
И получаю...

ЧЯДНТ??? Меня смущает в описании один момент: И, в-третьих, как написано в [1], если размер строки растра не кратен 4, то она дополняется от 1 до 3 пустыми (нулевыми) байтами, чтобы длина строки оказалась кратна параграфу. Вот это и есть самое неприятное.
Что-то нифига не понял... Люди, кто работал с BMP - помогите. Ну почти прочитал, ну уже понимаю как считать. Почему вывести в тупую не могу? Про перевёрнутость изображения тоже понял...
UPD Решено