BMPを選択した範囲内で保存する機能の追加 – 固定ページ 2 – プログラミング – Home

BMPを選択した範囲内で保存する機能の...
 
通知
すべてクリア

[解決済] BMPを選択した範囲内で保存する機能の追加

固定ページ 2 / 3

n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

ごめんなさい!
「pDoc->」は不要です。


返信引用
KM
 KM
(@KM)
ゲスト
結合: 22年前
投稿: 19
Topic starter  

はい、できました。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

え?マジでうまく保存できた?

では次に保存する部分の指定だけれど、
さっきの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);

とでも入れて、実行してみて下さい。


返信引用
KM
 KM
(@KM)
ゲスト
結合: 22年前
投稿: 19
Topic starter  

プログラムは実行できましたが、保存をしても保存した画像を見ることができない状態
です。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

pbiの所にこれも入れて下さい。

BITMAPFILEHEADER* pfh=reinterpret_cast<BITMAPFILEHEADER*>(header);
pfh->bfSize=((saverect.Width()*3+3)&~3)*saverect.Height();

あと何か抜けがあったかな…??


返信引用
KM
 KM
(@KM)
ゲスト
結合: 22年前
投稿: 19
Topic starter  

はい、入れました。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

また間違い:
これを先に書いて、
pbi->biSizeImage=((saverect.Width()*3+3)&~3)*saverect.Height();

これを修正。
pfh->bfSize=pbi->biSizeImage+13*sizeof(DWORD)+sizeof(WORD);


返信引用
KM
 KM
(@KM)
ゲスト
結合: 22年前
投稿: 19
Topic starter  

ちょっと混乱してきたのですが、現在このようになっていますが合ってますでしょう
か?

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


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

いやこんな感じに。

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


返信引用
KM
 KM
(@KM)
ゲスト
結合: 22年前
投稿: 19
Topic starter  

すいません。できました。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

保存も表示もできましたか?

ところで私は時間切れなので次は明日になります悪しからず。


返信引用
KM
 KM
(@KM)
ゲスト
結合: 22年前
投稿: 19
Topic starter  

ほんとにありがとうございますm(__)m

表示はまだできません。
ほんとうに申し訳ないのですが明日、明後日と私の都合上、進めることができないの
で、もしご都合がよろしければ月曜日からでもまた教えてください。

今日は長時間にわたり、ありがとうございました。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

これでうまくいくハズです。

//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;//詰め物
}


返信引用
KM
 KM
(@KM)
ゲスト
結合: 22年前
投稿: 19
Topic starter  

ありがとうございます。
最後のところ、iが再定義されてしまってますが、なにか他の変数でも問題ないですか?
一応kにすることでエラーを失くしましたが。

ファイルから「名前をつけて保存」には保存できるのですが、表示することができませ
ん。
新しくメニュー上に保存機能をつけて、他のソフトでもBMPとして表示できるように
したいのですがそういうことは可能なんでしょうか?
できるとしたら、Doc.cppかView.cppどっちにかけばいいんでしょうか?


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

>最後のところ、iが再定義されてしまってますが
間違いました。kにしてOKです。

このコードで保存したファイルは、私の方では
Windows XP付属のWindows Picture and Fax ViewerとPaintで正常に表示できたので、
間違ってはいないと思います。

>新しくメニュー上に保存機能をつけて、他のソフトでもBMPとして表示できるように
>したいのですがそういうことは可能なんでしょうか?
これが保存するコードなので可能では??? 意味違うかな??

>できるとしたら、Doc.cppかView.cppどっちにかけばいいんでしょうか?
保存コードはDoc.cppに書くのが普通です。


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました