これだけでは面白くないので、ちょっとした画像処理について説明します。
高速化とか考えていませんので、基本的な事をちょっとだけ書こうと思います。
まずは基礎から、ビットマップを読み込んで書き込むプログラムを作りました。
色情報にアクセスする事も出来るので、ちょっとだけ色情報に手を加えてみましょう。
<sample program cpp034-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();
}
//ここに画像処理のプログラムを書く
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;
}
|
<実行結果>
続行するには何かキーを押してください・・・
コメントの箇所に何らかの処理を加える事で画像処理が出来ます。
最初ですから、超適当な処理を入れてみます。
最初は「特定の色情報を消す」と言う事をやってみます。
画像の赤の情報だけ削除してみましょう。
<sample program cpp034-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(); } //ここに画像処理のプログラムを書く const int PIXEL_NUM = bmInfoHeader.biWidth * bmInfoHeader.biHeight; for (int i = 0; i < PIXEL_NUM; i++) { pColor[i].rgbtRed = 0; } 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; } |
<実行結果>
続行するには何かキーを押してください・・・
実行した後で「result.bmp」を開いてみてください。
赤の色情報が消されて↑のような画像になりました。
食欲無くす画像ですが、上手くいっているようです。
次回は別の処理を考えてみましょう。