dlinyj: (Default)
[personal profile] dlinyj
Что-то всё, я затупил с BMP. В прошлом посте я обнаружил "косяк" - это был 16-ти цветовой bmp, осюда вся порнуха. Но я сделал нормальный 256-цветовой bmp-файл.



Вот даже сам файл.
Сел, прочитал мануалы. Отличное описание на русском 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 Решено
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 08:28 pm
Powered by Dreamwidth Studios