次は画像の反転をやってみましょう。
テレビなどでよく見る処理ですが分かりますか?
処理的には、それぞれの色をビット反転させるだけです。
<sample program cpp035-01>
#include <iostream>
#include <fstream>
#include <Windows.h>
int main()
{
std::ifstream ifsBitmap;
ifsBitmap.open("omelet.bmp", std::ios::in | std::ios::binary);
if (!ifsBitmap) {
return 1;
}
BITMAPFILEHEADER bmFileHeader;
ifsBitmap.read((char*)&bmFileHeader, sizeof(bmFileHeader));
BITMAPINFOHEADER bmInfoHeader;
ifsBitmap.read((char*)&bmInfoHeader, sizeof(bmInfoHeader));
RGBTRIPLE *pColor = NULL;
pColor = new RGBTRIPLE[bmInfoHeader.biWidth * bmInfoHeader.biHeight];
if (!pColor) {
if (ifsBitmap.is_open()) {
ifsBitmap.close();
}
return 1;
}
ifsBitmap.read((char*)pColor, sizeof(RGBTRIPLE) * bmInfoHeader.biWidth * bmInfoHeader.biHeight);
if (ifsBitmap.is_open()) {
ifsBitmap.close();
}
//ここに画像処理のプログラムを書く
const int PIXEL_NUM = bmInfoHeader.biWidth * bmInfoHeader.biHeight;
for (int i = 0; i < PIXEL_NUM; i++) {
pColor[i].rgbtRed = ~pColor[i].rgbtRed;
pColor[i].rgbtGreen = ~pColor[i].rgbtGreen;
pColor[i].rgbtBlue = ~pColor[i].rgbtBlue;
}
std::ofstream ofsBitmap;
ofsBitmap.open("result.bmp", std::ios::out | std::ios::binary);
if (!ofsBitmap) {
if (pColor) {
delete[] pColor;
pColor = NULL;
}
return 1;
}
ofsBitmap.write((char*)&bmFileHeader, sizeof(bmFileHeader));
ofsBitmap.write((char*)&bmInfoHeader, sizeof(bmInfoHeader));
ofsBitmap.write((char*)pColor, sizeof(RGBTRIPLE) * bmInfoHeader.biWidth * bmInfoHeader.biHeight);
if (ofsBitmap.is_open()) {
ofsBitmap.close();
}
if (pColor) {
delete[] pColor;
pColor = NULL;
}
return 0;
}
|
<実行結果>
続行するには何かキーを押してください・・・
ビット反転は、C言語編の「論理演算」でやりました。
色情報を反転させるとどうなるのでしょうか?
プロジェクトフォルダの「result.bmp」を見てください。
気持ち悪いですが、色が反転しています。
単純なプログラムですが、色情報として見ると面白いですね。