Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как прочитать данные из .bmp файла?

9.4K
20 апреля 2005 года
TanaT
12 / / 07.04.2005
Привет всем!
Мне надо получить масив данных выбранной прямоугольной области (скажем (50,50)(100,100))из .bmp файла. Как это сделать?
425
21 апреля 2005 года
sq_deep
498 / / 18.02.2005
1. Если есть возможность использовать GDI+, то задача решается совсем просто. Там есть класс Bitmap, а в нём функции FromFile() и GetPixel().

2. В .NET есть свой класс Bitmap. Решение будет таким же простым. К тому же, он понимает не только BMP, но и некоторые другие форматы.

3. Если нет возможности воспользоваться предыдущими решениями, могу дать примитивнейший тест для чтения BMP. Но только он даже не все форматы BMP сможет прочитать, не говоря уже о других. Дать?
9.4K
21 апреля 2005 года
TanaT
12 / / 07.04.2005
Давай!
GetPixel - это фактически считывается интенсивность пикселя с экрана, а мне нада именно с файла. (GetPixel даёт разные результаты на разных компах, отличаются они мало, но ... На разных видеоадаптерах - разные результаты.)
527
21 апреля 2005 года
pavor
275 / / 28.09.2003
MSDN: bitmaps [Win32]->Using bitmaps->Storing an Image
Статья по сохранению в файл bitmap, прочитать и сделать все наоборот :)
9.4K
22 апреля 2005 года
TanaT
12 / / 07.04.2005
Спасибо за помощь!
Я уже сам роздуплился.

filename - имя файла, который открываем.

Код:
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);


Если я что-то напутал - прошу исправить.

P.S.
Для новичков, кем я и являюсь, прошу доходчевей излагать ответы. Желательно с кодом, который тчательно прокоментирован.:)
425
22 апреля 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by TanaT
Спасибо за помощь!
Я уже сам роздуплился.

filename - имя файла, который открываем.

 
Код:
...
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER,1,filePtr);
...
for (imageIdx = 0,imageIdx < bitmapInfoHeader->biSizeImage;imageIdx+=3)
...


Если я что-то напутал - прошу исправить.

P.S.
Для новичков, кем я и являюсь, прошу доходчевей излагать ответы. Желательно с кодом, который тчательно прокоментирован.:)


Вы, наверно, шутите, уважаемый TanaT. Вбили какой-то код, даже не попытавшись его запустить (см. оставленные куски), а теперь хотите, чтобы кто-то его за вас поотлаживал да еще и «тчательно прокоментировал» :angel:

Поэтому комментировать не буду. Посоветую только обратить внимание на BITMAPINFOHEADER.biBitCount. Как мне кажется, ваш код без анализа этого работать всё равно не будет, даже если исправить синтаксические ошибки.

Работайте.

9.4K
22 апреля 2005 года
TanaT
12 / / 07.04.2005
1. Этот код я набрал, но не компилил. Я просто хотел узнать нет ли ошибки в самом методе чтения файла. Посему присутствуют ошибки.
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);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог