FILE *filePtr;
BITMAPFILEHEADER bitmapFileHeader;
unsigned char *bitmapImage;
unsigned char tempRGB;
int imageIdx=0;
//открываем файл для чтения
filePtr = fopen(filename,"rb");
if (filePtr == NULL)
return NULL;
//считываем заголовок файла
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER,1,filePtr);
//проверяем, что это - bmp файл
if (bitmapFileHeader.bfType !=0x4D42)
{
fclose(filePtr);
return NULL;
}
//читаем заголовок информации растра
fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,filePtr);
//перемещаемся для чтения области данных .bmp файла
fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
//выделение объёма памяти, достаточно для чтения файла
bitmapImage = (unsigned char*)malloc(bitmapInfoHeader->biSizeImage);
//проверка выделеной памяти
if (!bitmapImage)
{
free(bitmapImage);
fclose(filePtr);
return NULL;
}
//чтение данных .bmp файла
fread(bitmapImage,bitmapInfoHeader->biSizeImage,filePtr);
//проверяем считались ли данные
if (bitmapImage == NULL)
{
fclose(filePtr);
return NULL;
}
//меняем местами r и b чтобы получить RGB вместо BGR
for (imageIdx = 0,imageIdx < bitmapInfoHeader->biSizeImage;imageIdx+=3)
{
tempRGB = bitmapImage[imageIdx];
bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
bitmapImage[imageIdx + 2] = tempRGB;
}
//закрываем файл
fclose(filePtr);
Как прочитать данные из .bmp файла?
Мне надо получить масив данных выбранной прямоугольной области (скажем (50,50)(100,100))из .bmp файла. Как это сделать?
2. В .NET есть свой класс Bitmap. Решение будет таким же простым. К тому же, он понимает не только BMP, но и некоторые другие форматы.
3. Если нет возможности воспользоваться предыдущими решениями, могу дать примитивнейший тест для чтения BMP. Но только он даже не все форматы BMP сможет прочитать, не говоря уже о других. Дать?
GetPixel - это фактически считывается интенсивность пикселя с экрана, а мне нада именно с файла. (GetPixel даёт разные результаты на разных компах, отличаются они мало, но ... На разных видеоадаптерах - разные результаты.)
Статья по сохранению в файл bitmap, прочитать и сделать все наоборот :)
Я уже сам роздуплился.
filename - имя файла, который открываем.
Код:
Если я что-то напутал - прошу исправить.
P.S.
Для новичков, кем я и являюсь, прошу доходчевей излагать ответы. Желательно с кодом, который тчательно прокоментирован.:)
Цитата:
Originally posted by TanaT
Спасибо за помощь!
Я уже сам роздуплился.
filename - имя файла, который открываем.
Если я что-то напутал - прошу исправить.
P.S.
Для новичков, кем я и являюсь, прошу доходчевей излагать ответы. Желательно с кодом, который тчательно прокоментирован.:)
Спасибо за помощь!
Я уже сам роздуплился.
filename - имя файла, который открываем.
Код:
...
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER,1,filePtr);
...
for (imageIdx = 0,imageIdx < bitmapInfoHeader->biSizeImage;imageIdx+=3)
...
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER,1,filePtr);
...
for (imageIdx = 0,imageIdx < bitmapInfoHeader->biSizeImage;imageIdx+=3)
...
Если я что-то напутал - прошу исправить.
P.S.
Для новичков, кем я и являюсь, прошу доходчевей излагать ответы. Желательно с кодом, который тчательно прокоментирован.:)
Вы, наверно, шутите, уважаемый TanaT. Вбили какой-то код, даже не попытавшись его запустить (см. оставленные куски), а теперь хотите, чтобы кто-то его за вас поотлаживал да еще и «тчательно прокоментировал» :angel:
Поэтому комментировать не буду. Посоветую только обратить внимание на BITMAPINFOHEADER.biBitCount. Как мне кажется, ваш код без анализа этого работать всё равно не будет, даже если исправить синтаксические ошибки.
Работайте.
2. Комментировать этот код я не просил. Просто мне хотелось бы, чтобы ответы были не -> "Пойди туда - не знаю куда, принеси то - не знаю что", а более понятные. В идеале - это код с комментарием.
Этот код я уже скомпилил и запустил. Работает!
Код:
FILE *filePtr;
BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER bitmapInfoHeader;
char *bitmapImage;
int imageIdx=0;
unsigned char tempRGB;
filePtr = fopen(str,"rb");
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER),1,filePtr);
fread(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,filePtr);
bitmapImage = new char[bitmapInfoHeader.biSizeImage];
fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
fread(bitmapImage, bitmapInfoHeader.biSizeImage, 1, filePtr);
for (imageIdx = 0; imageIdx < (int)(bitmapInfoHeader.biWidth * bitmapInfoHeader.biBitCount/8 ); imageIdx+=3)
{
tempRGB = bitmapImage[imageIdx];
bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
bitmapImage[imageIdx + 2] = tempRGB;
}
fclose(filePtr);
BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER bitmapInfoHeader;
char *bitmapImage;
int imageIdx=0;
unsigned char tempRGB;
filePtr = fopen(str,"rb");
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER),1,filePtr);
fread(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,filePtr);
bitmapImage = new char[bitmapInfoHeader.biSizeImage];
fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
fread(bitmapImage, bitmapInfoHeader.biSizeImage, 1, filePtr);
for (imageIdx = 0; imageIdx < (int)(bitmapInfoHeader.biWidth * bitmapInfoHeader.biBitCount/8 ); imageIdx+=3)
{
tempRGB = bitmapImage[imageIdx];
bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
bitmapImage[imageIdx + 2] = tempRGB;
}
fclose(filePtr);