所以我有一個問題搞清楚到底是什麼,試圖讀取任何支持24 bpp位圖圖像,並在同一文件夾重新創建它會錯。它適用於一個圖像,但不是我已經測試過的兩個圖像。當從位圖中讀取時,我使用標題本身中的信息。可以說我有三個問題。 1)我正確讀取位圖嗎? 2)我是否正確計算/使用/寫入填充? 3)我輸出是否正確? 三是確認否與此圖像及其輸出。不正確的位圖複製/輸出
同樣對於分配的2D陣列的圖像的原因是,這樣我嘗試後者可以通過旋轉90度位圖。
可惜我不能發表圖片,拍攝的圖像是從這裏開始,在rgb_24bpp.bmp http://pyglet.googlecode.com/svn/trunk/tests/image/
這是用於從圖像讀取計算填充用代碼。
ifstream myBitmap("rgb_24bpp.bmp", ios::binary | ios::beg);
// Get the total file size in bytes, testing file access
begin = myBitmap.tellg();
myBitmap.seekg(0, ios::end);
end = myBitmap.tellg();
// Actually reading image file
myBitmap.seekg(0, ios::beg);
myBitmap.read((char*)FileHeader, sizeof(BITMAPFILEHEADER));
myBitmap.read((char*)InfoHeader, sizeof(BITMAPINFOHEADER));
test = myBitmap.tellg();
RGBQUAD ** Image = new RGBQUAD*[InfoHeader->biWidth];
for (int i = 0; i < InfoHeader->biWidth; ++i) {
Image[i] = new RGBQUAD[InfoHeader->biHeight];
}
int pitch = InfoHeader->biWidth * 3;
if (pitch % 4 != 0)
{
pitch += 4 - (pitch % 4);
}
int padding = pitch - (InfoHeader->biWidth * 3);
cout << "padding: " << padding << endl;
myBitmap.seekg(FileHeader->bfOffBits, ios::beg);
for (int i = InfoHeader->biHeight; i > 0; --i) {
for (int j = 0; j < InfoHeader->biWidth; ++j) {
myBitmap.read((char*)&Image[j][i], sizeof(RGBQUAD));
}
if (padding != 0) myBitmap.read(PadBuffer, padding);
}
myBitmap.close();
begin/end/test都是streampos並打印在控制檯上進行調試。 這是用於輸出/重新創建圖像的代碼。
ofstream BitmapOut("Output.bmp");
BitmapOut.write((char*)FileHeader, sizeof(BITMAPFILEHEADER));
BitmapOut.write((char*)InfoHeader, sizeof(BITMAPINFOHEADER));
for (int i = InfoHeader->biHeight; i > 0; --i) {
for (int j = 0; j < InfoHeader->biWidth; ++j) {
BitmapOut.write((char*)&Image[j][i], sizeof(RGBQUAD));
}
if (padding != 0) BitmapOut.write("\0\0\0\0\0\0\0", padding);
}
BitmapOut.close();
我已經證實,這兩個標題是確實是正確的,可以從他們正常在3次不同的測試中提取數據。 利用這個傢伙代碼(對不起,這個項目只是非商業和自學)。 reading a .bmp file in c++
除了註釋掉RGBQUAD中保留的內容,並有效地改寫RGBTRI外。
是否有某些原因讓您爲每個像素單獨分配堆空間? – Logicrat
我做這種方式更多的簡單/理解,在這裏看我http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new後實現這是沉重而低效的,但它簡化了我自己使用2D陣列。 – Draxe
我已讓使用工具,如MS PAINT一些測試文件,並在每個角落一個不同顏色的像素生成純白色或純黑色的文件與BMP文件的工作。這樣可以很容易地使用調試器來執行代碼,並確保您具有正確的行對齊方式。使用BMP時,行對齊一直是我的大多數問題的來源。 – Logicrat