Witam!
Jak w temacie problem dotyczy przetworzenia kolorowej bitmapy na bitmapę w skali szarości. W efekcie końcowym w folderze mają się znajdować dwie bitmapy.
Wydaje mi się, że kod jest skończony ale jak chce wczytać przykładowo 256 kolorową bitmapę to program przestaje działać.
Nie mam pojęcia gdzie wkradł mi się błąd. Środowisko w jakim pisze - Dev C++.
Oto kod:
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <windows.h>
using namespace std;
struct Pixel
{ //odwrotna kolejnosc
unsigned char R;
unsigned char G;
unsigned char B;
};
int main()
{
COLORREF kolor;
HDC hdc;
int a, b, c;
char szary;
ifstream ifs("nazwa_pliku.bmp", ios::binary);
if(ifs.good() == true )
{
std::cout << "Uzyskano dostep do pliku..." << std::endl;
} else std::cout << "Brak dostepu do pliku..." << std::endl;
char* temp = new char[sizeof(BITMAPFILEHEADER)];
ifs.read(temp, sizeof(BITMAPFILEHEADER));
BITMAPFILEHEADER* bfh = (BITMAPFILEHEADER*)(temp);
delete[] temp;
temp = new char[sizeof(BITMAPINFOHEADER)];
ifs.read(temp, sizeof(BITMAPINFOHEADER));
BITMAPINFOHEADER* bih = (BITMAPINFOHEADER*)(temp);
delete[] temp;
ifs.seekg(bfh->bfOffBits, ios::beg); // wskazanie na początek danych obrazka
int width = bih->biWidth;
if(width % 4) width += 4 - (width % 4); // piksele są wyrównywane do 4 bajtów
Pixel** pixs = new Pixel*[bih->biHeight];
for(int i=0; i<bih->biHeight; i++)
{
temp = new char[3*width];
ifs.read(temp, 3*width);
pixs[i] = (Pixel*)(temp);
delete[] temp;
}
for (int i=0;i<bih->biHeight;i++)
{
for (int j=0;j<bih->biWidth;j++)
{
kolor=GetPixel(hdc, i,j);
pixs[i][j].R=GetRValue(kolor);
pixs[i][j].G=GetGValue(kolor);
pixs[i][j].B=GetBValue(kolor);
szary= (pixs[i][j].R+pixs[i][j].G+pixs[i][j].B)/3;
kolor=RGB(szary,szary,szary);
}
};
ofstream ofs("nazwa_pliku2.bmp", ios::binary);
ofs.write((char*)(bfh), sizeof(BITMAPFILEHEADER));//char* file , sizeof File
ofs.write((char*)(bih), sizeof(BITMAPINFOHEADER));
delete bfh;
delete bih;
for(int i=0; i<bih->biHeight; i++) delete[] pixs[i];
delete[] pixs;
system ("pause");
return 0;
}