So speichern Sie eine BMP-Datei in C++ [Duplikat]C++

Programme in C++. Entwicklerforum
Guest
 So speichern Sie eine BMP-Datei in C++ [Duplikat]

Post by Guest »

Ich versuche, eine BMP-Datei ohne Bibliotheken zu lesen und zu speichern. Ich lese BMP-Header und -Daten korrekt, kann sie aber nicht normal schreiben. Als Ergebnis erhalte ich ein beschädigtes Bild.
Ich denke, dass die Ausrichtung der Pixelzeilen mein Problem verursacht (die Anzahl der Bytes in der Zeile muss durch 4 geteilt werden), aber ich weiß nicht, wie ich das beheben kann.
Ich habe es versucht schreibe diese „Null“-Bytes und es löst meine Frage nicht.
.h-Datei:

Code: Select all

#pragma once

#pragma pack(push, 1)
struct BITMAPFILEHEADER
{
unsigned char type[2];
unsigned int size;
unsigned char reserved[4];
unsigned int offset;
};
struct BITMAPINFOHEADER
{
unsigned int headerSize;
unsigned int width;
unsigned int height;
unsigned short planes;
unsigned short bitsPerPixel;
};
struct Pixel
{
unsigned char red;
unsigned char green;
unsigned char blue;
};
#pragma pack(pop)

class BMP
{
public:
BITMAPFILEHEADER bmpHeader;
BITMAPINFOHEADER bmpInfo;
Pixel ** pixels;
int trashBytesCount;
void load(char loadFilePath[]);
void save(char saveFilePath[]);
};
cpp-Datei:

Code: Select all

void BMP::load(char loadFilePath[])
{
std::ifstream loadFile;
loadFile.open(loadFilePath, std::ios::binary);

if(loadFile.is_open())
{
loadFile.read((char *)&bmpHeader, sizeof(BITMAPFILEHEADER));
loadFile.read((char *)&bmpInfo, sizeof(BITMAPINFOHEADER));

loadFile.seekg(bmpHeader.offset, std::ios_base::beg);

pixels = new Pixel*[bmpInfo.height];
for(int i = 0; i < bmpInfo.height; i++)
{
pixels[i] = new Pixel[bmpInfo.width];
}
trashBytesCount = ((4 - (bmpInfo.width * (bmpInfo.bitsPerPixel / 8)) % 4) & 3);

Pixel pixel;
for(int i = 0; i < bmpInfo.height; i++)
{
for(int j = 0; j < bmpInfo.width; j++)
{
loadFile.read((char *)&pixel, sizeof(Pixel));
pixels[i][j] = pixel;
}
loadFile.seekg(trashBytesCount, std::ios_base::cur);
}
loadFile.close();
}
}

void BMP::save(char saveFilePath[])
{
std::ofstream saveFile;
saveFile.open(saveFilePath, std::ios::binary);

if(saveFile.is_open())
{
saveFile.write((char *)&bmpHeader, sizeof(BITMAPFILEHEADER));
saveFile.write((char *)&bmpInfo, sizeof(BITMAPINFOHEADER));

saveFile.seekp(bmpHeader.offset);

for(int i = 0; i < bmpInfo.height; i++)
{
for(int j = 0; j < bmpInfo.width; j++)
{
saveFile.write((char *)&pixels[i][j], sizeof(Pixel));
}
}
saveFile.close();
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post