次は画像の反転をやってみましょう。
テレビなどでよく見る処理ですが分かりますか?
処理的には、それぞれの色をビット反転させるだけです。
<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」を見てください。
気持ち悪いですが、色が反転しています。
単純なプログラムですが、色情報として見ると面白いですね。