次はグレースケール処理をやってみましょう。
グレースケールとは、白黒写真のようなものです。
カラー画像から色情報を抜き、明暗だけで表現します。
厳密な方法もありますが、簡単な方法でやってみます。
<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」を見てください。
別の方法にも挑戦したい方は、各自で調べてやってみてください。