tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルビットの深さを変えずにビットマップを縮小保存
記事No15836
投稿日: 2014/02/25(Tue) 09:04
投稿者juicy
ビットマップファイルを縮小保存をしたいです。
ただし、
 対象ファイルにはビットの深さ16と24のファイルが混在する
 縮小前後でビットの深さは変わらないように
という条件があります。

画像縮小・保存のサンプルコードを探してみましたが、
「ピクチャーボックスに貼り付けて縮小・保存」の方法しか
見つけられませんでした。
画面表示するとビットの深さが画面設定の影響を受ける(?)ため、
縮小前後で変わってしまいます。

ビットの深さを変えずにビットマップを縮小保存する方法を教えてください。

PG経験は5年程ですが、画像を扱うのは初めてでかなり苦戦しています。

開発環境:VB6.0 Windows7

[ツリー表示へ]
タイトルRe: ビットの深さを変えずにビットマップを縮小保存
記事No15837
投稿日: 2014/02/25(Tue) 11:12
投稿者魔界の仮面弁士
> 「ピクチャーボックスに貼り付けて縮小・保存」の方法しか
> 見つけられませんでした。

PictureBox の Image (≠Picture)プロパティを SavePicture する方法については、
画面設定の色深度に依存してしまうため、利用できません。
(SavePicture 自体は色深度を変更させないのですが、Image の色深度は OS 設定依存のため)


API だらけのコードにはなってしまいますが、かわりに、
GDI+ Flat API を利用してみては如何でしょうか。
実際に可能かどうかは未確認ですが…。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms533969.aspx


120x120 程度のサムネイル作成なら、GdipGetImageThumbnail API が使えるかも知れません。
(VB.NET で言えば、Image.GetThumbnailImage メソッドに相当する機能です)

拡縮描画するなら GdipDrawImage何某 API、保存は GdipSaveImageToFile API です。
保存時に指定する Bitmap のエンコーダーは {557CF400-1A04-11D3-9A73-0000F81EF32E} です。
色深度(ColorDepth)は、{66087055-ad66-4c7c-9a18-38a2310b8337} かな。
http://msdn.microsoft.com/ja-jp/library/system.drawing.imaging.encoder.aspx


あるいは、リサイズ機能を持ったフリーソフトを探してきて、
Shell 関数でコマンドライン起動して変換してもらうとか。

[ツリー表示へ]
タイトルRe: ビットの深さを変えずにビットマップを縮小保存
記事No15838
投稿日: 2014/02/25(Tue) 11:41
投稿者オショウ
> ビットマップファイルを縮小保存をしたいです。

  文面より、サイズを縮小と取れます。
  尚且つ画像ファイルとしての色深度は、オリジナルのまま。
  と言うことですネ?

  魔界の仮面弁士殿が書かれているように、安直にはできな
  いですが・・・1点疑問。

  縮小変換した場合、実際の画像の画素表現としての色深度
  は、縮小率によって数ドット平方の領域として平均化され
  失われてしまいますが、色深度を保つ必要があるのでしょ
  うか?

  縮小率が高ければ高いほど、色情報・色深度も失われてし
  まいます。どの程度の縮小率か書かれてませんが、色深度
  を保つ必要が無いように思いますので、いくら頑張ってコ
  ードを書いても、コストが高い機能になると思います。

※ 一般的にオリジナルからの拡縮では、1回の拡縮変換では
  25%程度が限界です。(33%と言う人もいるが)
  それ以上の拡縮は、色情報も色深度も、偽情報が比率的に
  多くなり、オリジナルからどんどんかけ離れていきます。

以上。参考まで

[ツリー表示へ]
タイトルRe^2: ビットの深さを変えずにビットマップを縮小保存
記事No15839
投稿日: 2014/02/25(Tue) 12:27
投稿者魔界の仮面弁士
>   縮小率が高ければ高いほど、色情報・色深度も失われてし
>   まいます。どの程度の縮小率か書かれてませんが、色深度

今回の場合、パレットカラー(BitCount = 1, 4, 8 の画像)は扱わないので、
その点は、さほど問題にはならない気もします。
フルカラー画像での多少の色の違いは誤差範囲かと。

もっとも、GDI+ の拡大縮小は、補間方法を変更してもさほど綺麗ではないので、
それをどこまで許容できるのかは別問題ですけれどね。


ちなみにパレットカラーだった場合、GDI+ では対応できません。
フルカラーで無いと、Graphics オブジェクトを生成できないはずなので。

[ツリー表示へ]
タイトルRe: ビットの深さを変えずにビットマップを縮小保存
記事No15840
投稿日: 2014/02/25(Tue) 18:35
投稿者juicy
魔界の仮面弁士さん、オショウさん、ご返信ありがとうございます。

教えていただいたAPIで何とかなるかやってみます。

また結果報告させて頂きます。

[ツリー表示へ]