Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
RSS
проблема с чтением bmp
 
пытаюсь читать bmp, следующим кодом
Код
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "windows.h"


int main(int argc, char* argv[])
{
   // Чтение изображения из файла
   FILE *pInFile = fopen("1.bmp","rb");
   if(pInFile == NULL)
      exit(0);
   tagBITMAPFILEHEADER stHead;
   fread(&stHead,sizeof(tagBITMAPFILEHEADER),1,pInFile);

   tagBITMAPINFOHEADER stInfoHead;
   fread(&stInfoHead,sizeof(tagBITMAPINFOHEADER),1,pInFile);

   fseek(pInFile,stHead.bfOffBits,SEEK_SET);

   RGBTRIPLE ** BitMap = new RGBTRIPLE *[stInfoHead.biHeight];
   for(int i = 0; i < stInfoHead.biHeight; i++)
   {
      BitMap[i] = new RGBTRIPLE[stInfoHead.biWidth];
      fread(BitMap[i],sizeof(RGBTRIPLE),stInfoHead.biWidth,pInFile);
   }


   fclose(pInFile);

   //обработка изображения
   const int SIZE_BLOCK = 8;

   for(int i=100; i<200; i+=1)
      for(int j=100; j<150 ; j++)
      {
         BitMap[i][j].rgbtBlue = 0;
         BitMap[i][j].rgbtGreen = 0;
         BitMap[i][j].rgbtRed = 0;
      }

      // запись  в файл
      FILE *pOutFile = fopen("2.bmp","wb");
      if(pOutFile == NULL)
         exit(0);

      stHead.bfOffBits = sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER);
      fwrite(&stHead,sizeof(tagBITMAPFILEHEADER),1,pOutFile);
      fwrite(&stInfoHead,sizeof(tagBITMAPINFOHEADER),1,pOutFile);
      for(int i = 0; i < stInfoHead.biHeight; i++)
         fwrite(BitMap[i],sizeof(RGBTRIPLE),stInfoHead.biWidth,pOutFile);

      fclose(pOutFile);


      return 0;
}


То что он работает толко с 24 битным это нормально, мне с другим и не надо работать(мне вобще bmp нужен толко для отладки алгоритма компрессии).
проблема в том что оно читается со смещением. Это обнаруживается следующим кодом
Код
   for(int i=100; i<200; i++)
      for(int j=100; j<150 ; j++)
      {
         BitMap[i][j].rgbtBlue = 0;
         BitMap[i][j].rgbtGreen = 0;
         BitMap[i][j].rgbtRed = 0;
      }

который, если я правильно понимаю, должен рисовать черный прямоугольник, вместо этого получается параллелепипед, т.е. строки в матрице идут со смещением.
Может кто сталкивалься уже и может подсказать в чем дело?
 
Код
   for(int i = 0; i < stInfoHead.biHeight; i++) 
   { 
      BitMap[i] = new RGBTRIPLE[stInfoHead.biWidth]; 
      fread(BitMap[i],sizeof(RGBTRIPLE),stInfoHead.biWidth,pInFile); 
   }


Вы не совсем правильно реализовали чтение точек.

Если длина строки точек не кратна 4, то она дополняется нулевыми байтами. Для 24-битного BITMAP количество этих нулевых байтов определяется по формуле width%4, где width - длина картинки в точках. То есть код будет приблизительно такой:

Код
   char NullByte;

   for(int i = 0; i < stInfoHead.biHeight; i++) 
   { 
      BitMap[i] = new RGBTRIPLE[stInfoHead.biWidth]; 
      fread(BitMap[i],sizeof(RGBTRIPLE),stInfoHead.biWidth,pInFile);
 
      // дочитываем нулевые байты
      for (int j = 0; j<(stInfoHead.biWidth%4); j++)
          fread(&NullByte,1,1,pInFile);
   }


Помню как пару лет назад сам долго с этим кувыркался.
Изменено: Soldier of Fortune - 20.01.2009 20:51:03
 
Спасибо за ответ. Пытался представить зачем эти дополнительные байты нужны, так и недогадался.
Изменено: lw+ - 22.01.2009 20:58:18
Страницы: 1
Читают тему