@ビットマップファイルを読み込む


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


@画像変換(2次微分)


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


戻る