[C++] bimapy - odczyt , przetworzenie i zapis

0

witam
Zadanie mam nastepujące napisac maly programik ktory bedzie przerabial bmp do skali szarosci no to zaczalem w googlach szperac i szperac no dobra wyczytalem jaki jest format jak sie to robi i urodzilem cos takiego

#include<windows.h>
#include<iostream>

using namespace std;

void main()
{
	
FILE *in;// plik z bitmapa
in=fopen("c:\\obraz.bmp","rb");
if(!in)
	cout<<"error";
else
	cout<<"ok";

BITMAPFILEHEADER bmfh;
fread(&bmfh,sizeof(BITMAPFILEHEADER),1,in);

BITMAPINFOHEADER bmih;
fread(&bmih,sizeof(BITMAPINFOHEADER),1,in);

if (bmfh.bfType ==0x4D42)
	cout<<"\nok bitmapa";
else
	cout<<"\ncos innego niz bitmapa";


cout<<" bit "<<bmih.biBitCount<<" H "<<bmih.biHeight<<" W "<<bmih.biWidth;

//int size;
//size=bmfh.bfSize-bmfh.bfOffBits;
//BYTE *bmpData;
//bmpData=new BYTE[size]; // tablica
//fread(bmpData,sizeof(BYTE),size,in);

/*
if((bmpData = (unsigned char*)calloc(((bmih.biHeight * bmih.biWidth) * 3), sizeof(unsigned char))) == NULL)
    {
    cout<<"\nCould not allocate any memory for the image array";
    }
bmpData = (unsigned char*)calloc(((bmih.biHeight * bmih.biWidth) * 3), sizeof(unsigned char));

  for(int Loop = 0; Loop < ((bmih.biHeight * bmih.biWidth) * 3); Loop += 3)
    fread(bmpData[Loop], sizeof(unsigned char[3]), 1, in);
*/

cout<<"\n"<<bmih.biSizeImage<< " R"<<bmpData[0]<<" G"<<bmpData[1]<<" B"<<bmpData[2];

}

na koncu dwie wykomentowane czesci ktore(formalnie znalazlem w necie) wlasciwie robia to samo ale chyba nie do konca skapowalem jak to ma dzialac bo nie dziala
czy ktos bylby tak dobry i mnie poprawil ?
prosze o ewentualne wskazowki à propos zapisu :)
dzieki z gory

0

mi sie zdaje ze zmienna in nie moze byc w dwoch bitmapfile eader nie rozdzieliles jednego pliku bitmapy od drugiego

0
ifstream in("c:\\obraz.bmp");
if(!in)
   cout<<"error";
else
{
   cout<<"ok";

   BITMAPFILEHEADER bmfh;
   in.read((char*)&bmfh, sizeof(BITMAPFILEHEADER));

   BITMAPINFOHEADER bmih;
   in.read((char*)&bmih, sizeof(BITMAPINFOHEADER));

   if (bmfh.bfType !=0x4D42)
        cout<<"\ncos innego niz bitmapa";
   else
   {
      cout<<"\nok bitmapa";


      cout<<" bit "<<bmih.biBitCount<<" H "<<bmih.biHeight<<" W "<<bmih.biWidth;

      void* bity = new char[bmfh.bfSize - bmfh.bfOffBits];
      in.seekg(bmfh.bfOffBits, ios::beg);
      in.read((char*) bity, bmfh.bfSize - bmfh.bfOffBits);
   }
}
  1. Pamiętaj, że każda linia jest wyrównywana do pełnych 4 bajtów.
  2. Rozmiar INFOHEADER'a to nie zawsze sizeof(BITMAPINFOHEADER) ! Jego rozmiar to bmih.biSize
  3. Za INFOHEADER'em może być paleta

1 użytkowników online, w tym zalogowanych: 0, gości: 1