私はしばらくの間画像処理に取り組んできましたが、奇妙なことに気づきました。私はBMPファイルを読んでおり、ReadFileなどの単純なメソッドを使用し、MicrosoftのBMP構造を使用しています。コードは次のとおりです。
ReadFile(_bmpFile,&bmpfh,sizeof(bfh),&data,NULL);
ReadFile(_bmpFile, &bmpih, sizeof(bih), &data, NULL);
imagesize = bih.biWidth*bih.biHeight;
image = new RGBQUAD[imagesize];
ReadFile(_bmpFile,image, imagesize*sizeof(RGBQUAD),&written,NULL);
このようにしてファイルを読み取り、単純なforループを使用してグレースケールに変換します。
for (int i = 0; i < imagesize; i++)
{
RED = image[i].rgbRed;
GREEN = image[i].rgbGreen;
BLUE = image[i].rgbBlue;
avg = (RED + GREEN + BLUE ) / 3;
image[i].rgbRed = avg;
image[i].rgbGreen = avg;
image[i].rgbBlue = avg;
}
このコードを使用してファイルを作成すると、次のようになります。
#pragma pack(push, 1)
WriteFile(_bmpFile, &bmpfh, sizeof(bfh), &data, NULL);
WriteFile(_bmpFile, &bmpih, sizeof(bih), &data, NULL);
WriteFile(_bmpFile, image, imagesize*sizeof(RGBQUAD), &written, NULL);
#pragma pack(pop)
ファイルはさらに大きくなっています(30MB-> 40MB)。
これが発生する理由は、RGBTRIPLEの代わりにRGBQUADを使用しているためですが、RGBTRIPLEを使用している場合、小さな画像をグレースケールに変換する際に問題が発生します-作成後に画像を開くことができません(正しい構造ではないと言います) 。
また、ファイルサイズに1バイトがありません(1174kb以降1173kb以降)
誰かがこれを以前に見たことがありますか(小さな写真でのみ発生します)?