★ビットマップファイルのコピー★


前回はビットマップデータを読み込むところまでやりましたが、成功しているかどうか分かりませんでした。

そこで、別のファイル名で保存する事によって、きちんと読み込めていたかどうか検証します。

準備のために、ちょっとだけプログラムを入れ替えます。

<sample program cpp033-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();
    }

    if (pColor) {
        delete[] pColor;
        pColor = NULL;
    }

    return 0;
}

<実行結果>

続行するには何かキーを押してください・・・

読み込むためのファイルストリームを先にクローズしました。

ビットマップのヘッダと色情報は残っていますからこれを使ってビットマップファイルをコピーします。

それでは、一気に書きます。

<sample program cpp033-02>

#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();
    }

    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;
}

<実行結果>

続行するには何かキーを押してください・・・

出力用ファイルストリームを用意し、ヘッダ2つと色情報を保存しました。

プロジェクトフォルダを開いて「result.bmp」があれば開いて確認してみてください。

↑これがあれば成功です。


次へ

戻る

目次へ