はじめまして。KMと申します。
実は現在2つのBMPを使ってピクセルの減算処理をしていまして、その処理した画像
をBMPで保存する機能をつけたいのですがどのようにして保存すればよいかわかりま
せん。保存の仕方としましては、メニューのところに従来ある「名前をつけて保存」と
は別に「画像を保存」という項目を設け、そこをクリックすると画面全体ではなく処理
後の画像の部分だけを保存するという形にしたいのですが、画像を保存する関数?など
があるのでしょうか?
お願いします。
開発環境はwindows XPで、Visual C++6.0です。
すみません。
開発環境の追加でMFCでプログラミングしています。
その2つのBMPはプログラム中でどのように保持しているのですか?
nさん返信ありがとうございます。
メニューからA画像指定、B画像指定として各画像をメニューのファイルを開くから読
み込めるようになっています。格納の仕方は、各ピクセル値を読み込んでA画像とB画
像それぞれの格納先を作っておき、実行時に指定されたらそこへ格納されるようになっ
ています。そして表示ボタンを押すとA画像とB画像を並べて2枚表示し、その下にC画
像として処理後の画像が表示されるようになっています。そのC画像だけを保存したい
のです。
よろしくお願いします。
それぞれの格納方法は具体的にわかりませんか?
// CHosei01Doc シリアライゼーション
void CHosei01Doc::Serialize(CArchive& ar)
{
DWORD dwDummy;
WORD wDummy;
int i,j,k;
int nTuika,nHasuu;
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
nHasuu=lWidth*3 % 4; //4バイトの倍数に対する端数を計算する
if(nHasuu!=0) nTuika=4-nHasuu; //端数があれば、追加すべきバイ
トを求める
else nTuika=0;
for(i=0;i<13;i++)
ar>>dwDummy;
ar>>wDummy;
k=bImageType;
for(j=239;j>=0;j--) //上下を逆にする
for(i=0;i<320;i++)
ar>>bBlue[k][i][j]>>bGreen[k][i][j]>>bRed[k][i][j];
}
}
//////////////////////////////////////////////////////////////////////////////
// CHosei01Doc コマンド
void CHosei01Doc::OnMenuImageA()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
bImageType=0;
}
void CHosei01Doc::OnMenuImageB()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
bImageType=1;
}
ソースをのせてみましたが、お分かりいただけるでしょうか?
bimageTypeに0か1が入ることでAかBかを切り替えています。
そして格納は主に上側のDoc.cppで行っています。
C画像はどのように保持されていますか?
A画像とB画像の減算した結果を表示しているだけなので、どこかへ格納ということは
していません。
bBlue,bGreen,bRedはそれぞれどのように宣言されていますか?
void CHosei01View::OnMenuHyouji(CCmdUI* pCmdUI)
{
unsigned char r0,r1,r2,g0,g1,g2,b0,b1,b2;
for(j=0;j<240;j++)
for(i=0;i<320;i++){
r0=pDoc->bRed[0][i][j];
g0=pDoc->bGreen[0][i][j];
b0=pDoc->bBlue[0][i][j];
pDC->SetPixel(x0+i,y0+j,RGB(r0,g0,b0)); //A
画像の表示
r1=pDoc->bRed[1][i][j];
g1=pDoc->bGreen[1][i][j];
b1=pDoc->bBlue[1][i][j];
pDC->SetPixel(x1+i,y0+j,RGB(r1,g1,b1)); //B
画像の表示
r2=fabs(r1-r0);
g2=fabs(g1-g0);
b2=fabs(b1-b0);
pDC->SetPixel(x1+i,y0+j,RGB(r2,g2,b2)); //C
画像の表示
}
といった感じです。
いや、どう使われているかではなくどう宣言されているかなんだけど。
「unsigned char bBlue[2][320][240];」かな?
すみません。
unsigned char bRed[2][512][512];
unsigned char bGreen[2][512][512];
unsigned char bBlue[2][512][512];
です。
ではまず、
bBlue,bGreen,bRedを宣言しているのと同じ場所に、
BYTE header[13*sizeof(DWORD)+sizeof(WORD)];
と宣言して下さい。
次にCHosei01Doc::Serialize()の
for(i=0;i<13;i++)
ar>>dwDummy;
ar>>wDummy;
を、
for(i=0;i<sizeof(header)/sizeof(BYTE);i++)
ar>>header[i];
と変えて下さい。
で次にSerialize()のif(ar.IsStoring()){}の{}の間に、
for(i=0;i<sizeof(header)/sizeof(BYTE);i++)
ar<<header[i];
for(j=0;j<240;j++){
for(i=0;i<320;i++){
ar<<fabs(pDoc->bBlue[1][i][j]-pDoc->bBlue[0][i][j]);
ar<<fabs(pDoc->bGreen[1][i][j]-pDoc->bGreen[0][i][j]);
ar<<fabs(pDoc->bRed[1][i][j]-pDoc->bRed[0][i][j]);
}
}
を入れて下さい。
とりあえずこれで全領域がファイルに保存されるか確かめてみて下さい。
ちょっと間違い。
最後のfor文のところを修正します。
for(j=0;j<240;j++){
for(i=0;i<320;i++){
unsigned char b=fabs(pDoc->bBlue[1][i][j]-pDoc->bBlue[0][i][j]);
unsigned char g=fabs(pDoc->bGreen[1][i][j]-pDoc->bGreen[0][i][j]);
unsigned char r=fabs(pDoc->bRed[1][i][j]-pDoc->bRed[0][i][j]);
ar<<b<<g<<r;
}
}
pDocが定義されていないというエラーが出たのですが、定義はどう書けばいいのでしょ
うか?