?

Log in

No account? Create an account
  Journal   Friends   Calendar   User Info   Memories
 

Электронный миссионер

26th January, 2018. 7:10 pm. За BMP замолвите слово

Что-то всё, я затупил с 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 Решено

Read 5 Notes -Make Notes

26th January, 2018. 7:46 pm. Загрузка bmp во фреймбуффер. Решение

Решение прошлого поста. Фух, нашёл готовое решение на каком-то ftp. Там есть ошибка в строчке (видимо преднамеренная)
*(pfbmap+(i+k*70)*fbvar.xres+j) = makepixel(&fbvar, pixel.r, pixel.g, pixel.b);

Исправить на:
*(pfbmap+i*fbvar.xres+j) = makepixel(&fbvar, pixel.r, pixel.g, pixel.b);

Там есть в качестве примера файлик wife.bmp
file wife.bmp 
wife.bmp: PC bitmap, Windows 3.x format, 240 x 240 x 24

И там фотография жены этого японца.


Оба изображения загружены с помощью этой программы

Это так мило, прям ми-ми-ми!!! Романтик в программировании. Вот я в холодной России могу полюбоваться женой программиста, который спас мне кучу часов ковыряния кода.

Read 6 Notes -Make Notes

Back A Day - Forward A Day