次はグレースケール処理をやってみましょう。
グレースケールとは、白黒写真のようなものです。
カラー画像から色情報を抜き、明暗だけで表現します。
厳密な方法もありますが、簡単な方法でやってみます。
<sample program cpp036-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;
unsigned int grayscale;
for (int i = 0; i < PIXEL_NUM; i++) {
grayscale = pColor[i].rgbtRed + pColor[i].rgbtGreen + pColor[i].rgbtBlue;
grayscale /= 3;
pColor[i].rgbtRed = (BYTE)grayscale;
pColor[i].rgbtGreen = (BYTE)grayscale;
pColor[i].rgbtBlue = (BYTE)grayscale;
}
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;
}
|
<実行結果>
続行するには何かキーを押してください・・・
3つの色情報を合計し、3で割った平均を求めました。
その平均値をRGBにそれぞれ入れました。
RGBの値に差が無くなりますから、どれかの色が突出することが無く、明暗だけが残ります。
では、プロジェクトフォルダの「result.bmp」を見てください。
別の方法にも挑戦したい方は、各自で調べてやってみてください。