ごめんなさい!
「pDoc->」は不要です。
はい、できました。
え?マジでうまく保存できた?
では次に保存する部分の指定だけれど、
さっきのheaderを宣言した場所に、
CRect saverect;
を付け足して下さい。
次にIsStoring()のところで、最初のfor文の前に
BITMAPINFOHEADER* pbi=
reinterpret_cast<BITMAPINFOHEADER*>(header+sizeof(BITMAPFILEHEADER));
pbi->biWidth=saverect.Width();
pbi->biHeight=saverect.Height();
を入れて下さい。次に最後のfor文を
for(j=saverect.top;j<saverect.bottom;j++){
for(i=saverect.left;i<saverect.right;i++){
(略)
}
}
と変えて下さい。
ここで問題がsaverectの内容の指定ですが、とりあえずIsStoring(){}の最初に
saverect.SetRect(10,10,20,20);
とでも入れて、実行してみて下さい。
プログラムは実行できましたが、保存をしても保存した画像を見ることができない状態
です。
pbiの所にこれも入れて下さい。
BITMAPFILEHEADER* pfh=reinterpret_cast<BITMAPFILEHEADER*>(header);
pfh->bfSize=((saverect.Width()*3+3)&~3)*saverect.Height();
あと何か抜けがあったかな…??
はい、入れました。
また間違い:
これを先に書いて、
pbi->biSizeImage=((saverect.Width()*3+3)&~3)*saverect.Height();
これを修正。
pfh->bfSize=pbi->biSizeImage+13*sizeof(DWORD)+sizeof(WORD);
ちょっと混乱してきたのですが、現在このようになっていますが合ってますでしょう
か?
saverect.SetRect(10,10,20,20);
for(i=0;i<sizeof(header)/sizeof(BYTE);i++)
ar<<header[i];
BITMAPINFOHEADER* pbi=
reinterpret_cast<BITMAPINFOHEADER*>(header+sizeof(BITMAPFILEHEADER));
pbi->biWidth=saverect.Width();
pbi->biHeight=saverect.Height();
BITMAPFILEHEADER* pfh=reinterpret_cast<BITMAPFILEHEADER*>(header);
pbi->biSizeImage=((saverect.Width()*3+3)&~3)*saverect.Height();
pfh->bfSize=pbi->biSizeImage+13*sizeof(DWORD)+sizeof(WORD);
いやこんな感じに。
saverect.SetRect(10,10,20,20);
BITMAPINFOHEADER* pbi=…;
pbi->biWidth=…;
pbi->biHeight=…;
pbi->biSizeImage=((saverect.Width()*3+3)&~3)*saverect.Height();
BITMAPFILEHEADER* pfh=…;
pfh->bfSize=pbi->biSizeImage+13*sizeof(DWORD)+sizeof(WORD);
for(i=0;i<sizeof(header)/sizeof(BYTE);i++)
ar<<header[i];
すいません。できました。
保存も表示もできましたか?
ところで私は時間切れなので次は明日になります悪しからず。
ほんとにありがとうございますm(__)m
表示はまだできません。
ほんとうに申し訳ないのですが明日、明後日と私の都合上、進めることができないの
で、もしご都合がよろしければ月曜日からでもまた教えてください。
今日は長時間にわたり、ありがとうございました。
これでうまくいくハズです。
//Doc.hに追加するもの
enum { HEADERSIZE=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) };
unsigned char header[HEADERSIZE];//BYTEもunsigned charも同じ型
//Doc.cppのar.IsStoring()のとこ
saverect.SetRect(10,10,20,20);
BITMAPFILEHEADER* pbfh=reinterpret_cast<BITMAPFILEHEADER*>(header);
BITMAPINFOHEADER* pbih=reinterpret_cast<BITMAPINFOHEADER*>(header+sizeof
(BITMAPFILEHEADER));
pbih->biWidth=saverect.Width();
pbih->biHeight=saverect.Height();
pbih->biSizeImage=((pbih->biWidth*3+3)&~3)*pbih->biHeight;
pbfh->bfSize=HEADERSIZE+pbih->biSizeImage;
for(int i=0;i<HEADERSIZE;++i) ar<<header[i];
const int rest=((pbih->biWidth*3+3)&~3)-pbih->biWidth*3;//詰め物の長さの計算
for(int j=saverect.bottom-1;j>=saverect.top;--j)
{
for(int i=saverect.left;i<saverect.right;++i)
{
unsigned char b=fabs(bBlue[1][i][j]-bBlue[0][i][j]);
unsigned char g=fabs(bGreen[1][i][j]-bGreen[0][i][j]);
unsigned char r=fabs(bRed[1][i][j]-bRed[0][i][j]);
ar<<b<<g<<r;
}
for(int i=0;i<rest;++i) ar<<(unsigned char)0;//詰め物
}
ありがとうございます。
最後のところ、iが再定義されてしまってますが、なにか他の変数でも問題ないですか?
一応kにすることでエラーを失くしましたが。
ファイルから「名前をつけて保存」には保存できるのですが、表示することができませ
ん。
新しくメニュー上に保存機能をつけて、他のソフトでもBMPとして表示できるように
したいのですがそういうことは可能なんでしょうか?
できるとしたら、Doc.cppかView.cppどっちにかけばいいんでしょうか?
>最後のところ、iが再定義されてしまってますが
間違いました。kにしてOKです。
このコードで保存したファイルは、私の方では
Windows XP付属のWindows Picture and Fax ViewerとPaintで正常に表示できたので、
間違ってはいないと思います。
>新しくメニュー上に保存機能をつけて、他のソフトでもBMPとして表示できるように
>したいのですがそういうことは可能なんでしょうか?
これが保存するコードなので可能では??? 意味違うかな??
>できるとしたら、Doc.cppかView.cppどっちにかけばいいんでしょうか?
保存コードはDoc.cppに書くのが普通です。