★画像処理(反転)★


次は画像の反転をやってみましょう。

テレビなどでよく見る処理ですが分かりますか?

処理的には、それぞれの色をビット反転させるだけです。

<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」を見てください。

気持ち悪いですが、色が反転しています。

単純なプログラムですが、色情報として見ると面白いですね。


次へ

戻る

目次へ