BMP 形式の意味がわかりません。単純であることはわかっていますが、どういうわけか何かが欠けています。イメージを定義する実際のバイトが続く 2 つのヘッダーだと思っていましたが、数値が加算されません。
たとえば、この BMP ファイルをメモリ (640x480 8bpp グレースケール) にロードして、別のファイルに書き戻そうとしています。私が理解していることから、2 つの異なるヘッダー BITMAPFILEHEADER と BITMAPINFOHEADER があります。BITMAPFILEHEADER は 14 バイトで、BITMAPINFOHEADER は 40 バイトです (これは BMP に依存します。それは別の話です)。とにかく、BITMAPFILEHEADER は、そのパラメーター bfOffBits を介して、ビットマップ ビットがオフセット 1078 から始まることを示しています。これは、1024 ( 1078 - (40+14) ) バイトがあり、より多くの情報を運ぶことを意味します。それらのバイトは何ですか、どうすればそれらを読むことができますか、これが問題です。または、BMP をロードしてディスクに書き込むより正しい方法はありますか?
参考までに、私が使用したコードは次のとおりです(私はこれをすべてWindowsで行っています)。
#include <windows.h>
#include <iostream>
#include <stdio.h>
HANDLE hfile;
DWORD written;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
int main()
hfile = CreateFile("image.bmp",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
ReadFile(hfile,&bfh,sizeof(bfh),&written,NULL);
ReadFile(hfile,&bih,sizeof(bih),&written,NULL);
int imagesize = bih.biWidth * bih.biHeight;
image = (unsigned char*) malloc(imagesize);
ReadFile(hfile,image,imagesize*sizeof(char),&written,NULL);
CloseHandle(hfile);
次に、ファイルへの書き込みとは正反対のことをしています。
hfile = CreateFile("imageout.bmp",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hfile,&bfh,sizeof(bfh),&written,NULL);
WriteFile(hfile,&bih,sizeof(bih),&written,NULL);
WriteFile(hfile,image,imagesize*sizeof(char),&written,NULL);
CloseHandle(hfile);
編集 --- 解決済み
わかりましたので、ようやく正しく理解できました。結局のところ、それほど複雑ではありませんでした。Viktor が指摘したように、これらの 1024 バイトはカラー パレットを表します。
コードに次を追加しました。
RGBQUAD palette[256];
// [...] previous declarations [...] int main() [...] then read two headers
ReadFile(hfile,palette,sizeof(palette),&written,NULL);
そして、私が書き戻すとき、私は以下を追加しました、
WriteFile(hfile,palette,sizeof(palette),&written,NULL);