CString filename="test.bmp"; //ビットマップのファイル名 CFile file; BITMAPINFOHEADER InfoHdr; BITMAPFILEHEADER FileHdr; //ファイルを開く if(!file.Open(filename,CFile::modeRead|CFile::typeBinary)){ return; } //ファイルヘッダ部とインフォヘッダ部を読み込む file.Read(&FileHdr,sizeof(BITMAPFILEHEADER)); file.Read(&InfoHdr,sizeof(BITMAPINFOHEADER)); //前回使用していれば、いったんメモリ解放する if(m_BmpInfo) delete[] m_BmpInfo; if(myBmpInfoHdr.biBitCount < 24){ AfxMessageBox("このソフトは24ビットビットマップと32ビットビットマップのみ対応しています。"); return; } m_BmpInfo = (LPBITMAPINFO)new char[sizeof(BITMAPINFO)]; //m_BmpInfo(LPBITMAPINFO型)のmyBmpInfoHdrメンバに設定 m_BmpInfo->bmiHeader = myBmpInfoHdr; //ファイル内のビットマップ実データを位置に合わせる file.Seek(m_BmpFileHdr.bfOffBits,CFile::begin); //前回の画像イメージをいったん解放 if(m_BmpImage) delete[] m_BmpImage; //実画像データ分のバイト数を確保 //bfsize ビットマップファイル全サイズ //bfOffBits 先頭にあるヘッダ情報サイズ m_BmpImage = new char[m_BmpFileHdr.bfSize - m_BmpFileHdr.bfOffBits]; //ビットマップ実データを読み込み格納 file.Read(m_BmpImage,m_BmpFileHdr.bfSize - m_BmpFileHdr.bfOffBits); file.Close(); |
char r[400][400],g[400][400],b[400][400]; char ro[400][400],go[400][400],bo[400][400]; int i,j; //画像の準備ができていなければリターン if(!m_BmpInfo) return; //----------画像変換----- //ビットマップは行の最後に空データ何ビットかついているが、何ビットか予測できん!! ということで、こんな処理をします。 int line_data = ((m_BmpFileHdr.bfSize - m_BmpFileHdr.bfOffBits) - m_ImageHeight * m_ImageWidth * 3) / m_ImageHeight; for(j=0;j<m_ImageHeight;j++){ for(i=0;i<m_ImageWidth;i++){ r[i][m_ImageHeight-1-j]=m_BmpImage[i*3+2 + (m_ImageWidth*3 + line_data)*j]; g[i][m_ImageHeight-1-j]=m_BmpImage[i*3+1 + (m_ImageWidth*3 + line_data)*j]; b[i][m_ImageHeight-1-j]=m_BmpImage[i*3 + (m_ImageWidth*3 + line_data)*j]; } } //ラプラシアンフィルタ unsinged int fx; for(j=0;j<m_ImageHeight;j++){ for(i=0;i<m_ImageWidth;i++){ fx = 0; fx = fx - r[i][j-1]; fx = fx - r[i-1][j]; fx = fx + r[i][j]*4; fx = fx - r[i][j+1]; fx = fx - r[i+1][j]; fx = abs(fx) + 128; ro[i][j]=fx; fx = 0; fx = fx - g[i][j-1]; fx = fx - g[i-1][j]; fx = fx + g[i][j]*4; fx = fx - g[i][j+1]; fx = fx - g[i+1][j]; fx = abs(fx) + 128; go[i][j]=fx; fx = 0; fx = fx - b[i][j-1]; fx = fx - b[i-1][j]; fx = fx + b[i][j]*4; fx = fx - b[i][j+1]; fx = fx - b[i+1][j]; fx = abs(fx) + 128; bo[i][j]=fx; } } for(j=0;j<m_ImageHeight;j++){ for(i=0;i<m_ImageWidth;i++){ m_BmpImage[i*3+2 + (m_ImageWidth*3 + line_data)*j]=ro[i][m_ImageHeight-1-j]; m_BmpImage[i*3+1 + (m_ImageWidth*3 + line_data)*j]=go[i][m_ImageHeight-1-j]; m_BmpImage[i*3 + (m_ImageWidth*3 + line_data)*j]=bo[i][m_ImageHeight-1-j]; } } |