bmpファイル縮小したのち連結して、一つのファイルに保存するには – プログラミング – Home

bmpファイル縮小したのち連結して、一...
 
通知
すべてクリア

[解決済] bmpファイル縮小したのち連結して、一つのファイルに保存するには


kai
 kai
(@kai)
ゲスト
結合: 22年前
投稿: 64
Topic starter  

質問内容はタイトルどうりですが、詳細を。
指定したディレクトリにあるbmpファイル縮小した後にを連結して、
一つのbmpファイルとして保存したいです。

例)
X1Y1.bmp
X2Y1.bmp
X1Y2.bmp
X2Y2.bmp
ファイルの一つ一つ大きさが 800px * 600px
連結した結果が 結果.bmp 画像サイズ 800px * 600px

となるようにしたいです。
何か参考となるサイトやアドバイスをお願いします

環境:VC++2005Pro WinXP MFC使用 ダイアログベース


引用未解決
トピックタグ
kai
 kai
(@kai)
ゲスト
結合: 22年前
投稿: 64
Topic starter  

すいません、2行目のをはミスです。

また、縮小した後に連結~としていますが、
連結した後に縮小したほうがいいのかも?


返信引用
かもねぎ
 かもねぎ
(@かもねぎ)
ゲスト
結合: 17年前
投稿: 61
 

StretchDIBitsとかでなんとかなりそうかも
しれません。


返信引用
えちぜん
 えちぜん
(@えちぜん)
ゲスト
結合: 18年前
投稿: 15
 

他には、色深度が全て共通であれば、それぞれのビットマップから1ピクセル置きにデー
タをコピーすることで、できそうな気がしますね。
そのとき、スレッド化すれば効率よく出来そう。

黒を連結先の左上にコピーする
順次右上、左下、右下も同様の処理を行う。
■□■□
□□□□
■□■□
□□□□
(X1Y1)

■■□□
■■□□
□□□□
□□□□
(連結先)


返信引用
金魚ちゃん
 金魚ちゃん
(@金魚ちゃん)
ゲスト
結合: 16年前
投稿: 52
 

とりあえずメモリデバイスコンテキストを1つ用意しておく。
そこへ StretchDIBits 等を使って縮小した画像を転送(描画)。
※転送するときに縮小画像のサイズから描画位置を計算。

あとはメモリデバイスコンテキストに描画された内容を
そのまま1つのBMP画像として保存すりゃえぇよ。

> また、縮小した後に連結~としていますが、
> 連結した後に縮小したほうがいいのかも?
これってメモリが無駄になるから縮小画像を連結した方がいいと思う。
綺麗に縮小したいなら StretchDIBits を使わずに同等処理を実装。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

StretchDIBitsを使うよりもDIBSectionとして読み込んで
StretchBltで転送した方が高速に動作します。
GDI+を使う場合は高品質な縮小描画も可能です。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

ちょっと混乱しそうなので簡単に説明しておきます。

まず、 Windowsでビットマップを扱うためには、大きく2つの形式があるという
ことを覚えてください。
1) 通常の GDI ビットマップ(DDB形式)
2) DIB形式のビットマップ

形式を指定せずにビットマップを読み込んだ場合はDDB形式で読み込まれます。
その場合、StretchBlt()でビットマップを拡大縮小できます。
ただし、StretchBlt()を呼ぶ前に、SetStretchBltMode(HALFTONE)を忘れずに指
定してください。そうしないと縮小後のビットマップは汚くなります。
そこまでできたら、BitBlt()で目標の位置にビットマップを転送するだけです。

次にDIB形式ですが、ビットマップを読み込む際にDIB形式であることを指定しま
す。LoadImage()で読み込むなら LR_CREATEDIBSECTION を指定します。
この形式で読み込むメリットは、ビットマップをビット配列として扱えることで
す。ビット配列として扱うと、ビットマップのミラー反転,背景透過表示,...
などが簡単に行えます。
逆に言うと、ビット配列として扱う必要がない場合は DIB形式を使うのは、手間
が増える分損な感じです。
詳しくは以下のHPの[DIB]を参照してください。
http://eternalwindows.jp/graphics/bitmap/bitmap00.html

DIBとして読み込んだら、皆さんのおっしゃっているStretchDIBits()が使えます
し、DIBもビットマップに変わりないので、DDBのときと同じようにStretchBlt()
で縮小もできます。

ざっと、そんな感じです。


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

>環境:VC++2005Pro WinXP MFC使用 ダイアログベース
この環境なら、
CImage
がかなり楽


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

返信が遅くなり申し訳ありません。
みなさまアドバイスを元に目的のコーディングができました。
ありがとう御座いました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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