Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual C++
Перезагрузить страницу Как обработать BMP файл в Visual C++
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
zerkalo zerkalo вне форума
Member
 
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.09.2004
По умолчанию Как обработать BMP файл в Visual C++ - 06.09.2004, 01:49

Люди помогите. Как обработать BMP файл в Visual C++. На уровне пикселей. Аля...100 пиксель цвета красного...прога пишит что в 100 пиксиле есть пиксель и он красный....
Ответить с цитированием
  (#2 (permalink)) Старый
3ton 3ton вне форума
Member
 
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.02.2004
По умолчанию 06.09.2004, 03:56

Я обрабатывал вручную. Есть две структуры - BITMAPINFOHEADER и BITMAPFILEHEADER. В них содержится служебная инфа об BMP.
В общем простой BMP-файл (без сжатия и палиры(какими являются 24-битные)) выглядит следующим образом:
BITMAPFILEHEADER + BITMAPINFOHEADER + таблица цветов пикселей.

В BITMAPFILEHEADER - общая инфа о файле (в частности bfOffBits содержит смещение от начала файла до таблицы цветов пикселей).
В BITMAPINFOHEADER - инфа собственно о картинке (размеры, глубина цвета и т.д)
таблица цветов пикселей - 2-х мерный массив структур из 3-х елементов (RGB, их размерность соответственно зависит от глубины цвета) каждая строка которого дополнена до 4-х байтной границы.

Тока надо учесть, что пиксели в BMP записаны в обратном порядке - начиная от нижнего левого угла .

Короче вот такая у меня ф-я создания BMP:
Код:
BYTE AxCreateBMP(LPTSTR lpFileName, WORD BMPWidth, WORD BMPHeight, DWORD **lpData)
{
   LPBYTE            lpBits;        // Указатель на данные BMP
   HANDLE            hOutFile;      // Хендл файла
   PBITMAPINFOHEADER lpMyBMPInfo;   // Информационная структура BMP
   PBITMAPFILEHEADER lpMyFileInfo;  // Структура инфы файла BMP
   DWORD             dwTmp; 

   BYTE              bOver;         // Дополнение до 4 байтной границы
   DWORD             dwDataSize;    // Общий рамер данных BMP (с выравниванием)

   if ((BMPWidth*3)%4) bOver = 4 - (BMPWidth*3)%4;
   else bOver = 0;

   dwDataSize = BMPHeight*(BMPWidth*3 + bOver);

   lpBits = new BYTE[dwDataSize];   

   DWORD inum = 0;
   for (DWORD iy=BMPHeight; iy>0; iy--)
   {
      for (DWORD ix=0; ix<BMPWidth; ix++)
      {
         // R
         lpBits[inum] = GetRValue(lpData[iy-1][ix]);
         inum++;
         // G
         lpBits[inum] = GetGValue(lpData[iy-1][ix]);
         inum++;
         // B
         lpBits[inum] = GetBValue(lpData[iy-1][ix]);
         inum++;

      }      

      for (BYTE i=0; i<bOver; i++)
      {
         lpBits[inum] = 0;
         inum++;
      }
   }

   lpMyBMPInfo = new BITMAPINFOHEADER;

   lpMyBMPInfo->biSize   = sizeof(BITMAPINFOHEADER);
   lpMyBMPInfo->biHeight = BMPHeight; 
   lpMyBMPInfo->biWidth  = BMPWidth; 
   lpMyBMPInfo->biPlanes = 1;
   lpMyBMPInfo->biBitCount = 24;
   lpMyBMPInfo->biCompression = BI_RGB;
   lpMyBMPInfo->biSizeImage = 0;
   lpMyBMPInfo->biXPelsPerMeter = BMPWidth;
   lpMyBMPInfo->biYPelsPerMeter = BMPHeight;
   lpMyBMPInfo->biClrImportant = 0;
   lpMyBMPInfo->biClrUsed = 0;

   lpMyFileInfo = new BITMAPFILEHEADER;
   
   lpMyFileInfo->bfType = 0x4d42;
   lpMyFileInfo->bfReserved1 = 0;
   lpMyFileInfo->bfReserved2 = 0;   
   lpMyFileInfo->bfOffBits = (DWORD) sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
   lpMyFileInfo->bfSize = (DWORD) (dwDataSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
  
   hOutFile = CreateFile(lpFileName, GENERIC_READ | GENERIC_WRITE, 
                         (DWORD) 0, NULL, CREATE_ALWAYS, 
                         FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); 
   
   if (hOutFile == INVALID_HANDLE_VALUE) return 0; 
   
   WriteFile(hOutFile, (LPVOID) lpMyFileInfo, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp, NULL);

   WriteFile(hOutFile, (LPVOID) lpMyBMPInfo, sizeof(BITMAPINFOHEADER), (LPDWORD) &dwTmp, NULL);

   WriteFile(hOutFile, (LPVOID) lpBits, dwDataSize, (LPDWORD) &dwTmp, NULL);

   CloseHandle(hOutFile);
   
   delete[] lpBits;
   delete lpMyFileInfo;
   delete lpMyBMPInfo;

   return 1;
}
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обработать xls файлы Timerhan C++ Builder 2 11.01.2011 10:42
Каким способом быстрее обработать файл AZzz C++ Builder 8 13.02.2008 04:28
Как прочитать xls-файл с помощью Visual C++ API lorderetik Visual C++ 8 31.01.2006 14:27
Открыть файл в Visual C++ для чтение другим приложением TC Visual C++ 1 10.08.2005 23:29
Как в Visual C++ открыть видео файл AVI nadya Visual C++ 1 12.05.2005 00:55
Как создать exe файл под visual c++ imported_Programist Вопросы начинающих программистов 3 28.09.2004 23:25
Сбой Visual C++ .NET 2003 при попытке сохранить файл исходника __sanya__ Visual C++ 6 08.08.2004 21:54
Как читать TXT файл по строчно в Microcoft Visual C++ Anonymous Вопросы начинающих программистов 4 17.05.2004 16:45
Как программно редактировать doc файл в Visual C++ Anonymous Visual C++ 8 01.09.2003 10:58
Как в Visual С++ в RichEdit загрузить файл и вывести его на экран без меню Open Anonymous Visual C++ 1 06.11.2002 13:45
Как обработать клавиатурный int из VxD Anonymous Assembler 1 15.10.2002 03:01
Как обработать клавиатурный int из VxD Anonymous С/С++ 0 09.10.2002 02:08



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов