LINUX.ORG.RU

Как работать с BMP разной битности.


0

0

Т.е. с 1,8,12,24,32 битами. Для работы с 32 есть следущий код но в нём присутствует неувязочка:

//////////////////////////////////////////////////////////////////////////////// ///////////////////////////
#include <qpainter.h>
#include <qcolor.h>
#include "bmpstruct.h"

QPainter *p = new QPainter();

int file_bmp; //дескриптор файла
tagBITMAPFILEHEADER bmpFileHeader;
tagBITMAPINFOHEADER bmpInfoHeader;
tagRGBQUAD pixel;

void mainwindow::drow()
{
p -> begin (this);

file_bmp = open (Path -> text(), O_RDONLY);

read (file_bmp, &bmpFileHeader, 14); //считывание заголовка файла
read (file_bmp, &bmpInfoHeader, 40); //считывание заголовка изображения

for (int y = bmpInfoHeader.biHeight; y > 0; y--)
{
for (int x = 0; x < bmpInfoHeader.biWidth; x++)
{
read (file_bmp, &pixel, sizeof(tagRGBQUAD));
p -> setPen(QColor((int)pixel.rgbBlue,(int)pixel.rgbGreen,(int)pixel.rgbRed));
p -> drawPoint(x,y);
}
}
p -> end();
}
//////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////

/////////////////////////////// bmpstruct.h //////////////////////////////////////////////////////////
#include <fcntl.h> //Необходимо для работы системной функции открытия файлов
#include <unistd.h> //Необходимо для работы системной функции чтения файлов
#include <iostream.h> //необходим для cout

#pragma pack(push,1)

typedef unsigned long DWORD; // Двойное слово - 32 бита (разряда)
typedef unsigned short WORD; // Слово - 16 бит (разрядов)
typedef signed long LONG;
typedef unsigned int UINT;

// Заголовок файла
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 'BM' = 4D42h
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits; // Смещение к растру
};

// Заголовок Bitmap
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
};

//структура пиксела
typedef struct tagRGBQUAD
{
char rgbBlue;
char rgbGreen;
char rgbRed;
char rgbReserved;
};

#pragma pack(pop)
//////////////////////////////////////////////////////////////////////////////// /////////////////////////////

а именно при выводе наблюдаются искажения цвета, т.е. к примеру чёрный и зелёный выводятся нормально а синий и красный неверно , вместо них другие цвета (похоже на негатив или что-то в этом духе). А с другой битностью вообще цирк. Если пытаться прочесть файл указанной выше программой, то вместо цветов наблюдается подобие чернобелого изображения ну не совсем но похож на это с эфектом разлиновости. Да к тому же появляется не одно а несколько изображений к примеру вместо одного шара четыре.

★★★★★
Ответ на: комментарий от anonymous

необходимо считывать всё вручную.

cyclon ★★★★★
() автор топика

p -> setPen(QColor((int)pixel.rgbBlue,(int)pixel.rgbGreen,(int)pixel.rgbRed));

местами поменяй. надо RGB а не BGR в QColor давать ;)

anonymous
()

Важно, что кроме того, что BGR, а не RGB. И !!! ширина картинки записанная в bmp такая, что там записано количество байт кратное толи 4 байтам, толи 8-ми, я уже не помню.

arkhivania
()
Ответ на: комментарий от arkhivania

Дык уже пробовал такое делать т.е. выводить не всю картинку а только четверть или треть и так далее... Но в результате получалась мутотень.

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.