パスワードを忘れた? アカウント作成
11050731 journal
日記

tsubu_csの日記: 続、WPFを使った画像の加工方法で悩む 2

日記 by tsubu_cs

画像ファイルを加工(回転、クロップ) について模索しているという話で、
現状までの試行錯誤の過程が以下。

理想というかなるべく守りたいポリシー :
1. A4 600dpi までの画像を処理できる。
2. なるべく元のフォーマット、情報を保つ。

■ 方法1
・DrawingVisualからDrawingContext使って回転&描画、その後そのDrawingVisualを
 RenderTargetBitmapにDrawという手順

前回 コメントで教えて頂いた方法です。ご教授頂きありがとうございました。

デメリットは保存フォーマットの制限。
RenderTargetBitmap の Format指定が PixelFormats.Pbgra32 でないと例外を受けた。
8bitグレーや各色16bit拡張を想定した場合この制限はきつい。

■ 方法2
・WriteableBitmapEx を導入し、それを使って回転する。

メリットは自前で作らなくて済むこと。
デメリットは保存フォーマットの制限。
ソースを見たら PixelFormats.Pbgra32 を想定していたので採用せず。

■ 方法3
・(WPFでないけど) OpenCVを使って、回転、保存する。

メリットは処理速度。試した範囲では最も早い印象を受けた。
デメリットはメタデータとして解像度の指定ができないこと。
OpenCVの imwrite() で保存する際、解像度が指定できない。
後、元フォーマットが 32bit color だったのが 24bit colorへ微妙に変わってしまったのも、
なるべく元のままの方がいいというポリシーから離れてしまう。

■ 方法4
・WriteableBitmapを使って自前で回転処理を記述。

デメリットは、メモリ。
600dpi のB5画像と回転後の画像 2枚を WriteableBitmapで確保しようとして
OutOfMemoryExceptionをくらう時がある。
A4までは考慮しているので、これではちとまずい。

■ 方法5
・方法4の改善策としてWriteableBitmapでとらずに、byte[] で確保して処理する。

例外はくらわなくなったが、ちと遅い……
(B5オーバースキャン 600dpiの画像で 20秒前後)

なかなかうまくいきませんなぁ…… (遠い目

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2014年06月08日 3時17分 (#2617230)
    ColorConvertedBitmap or FormatConvertedBitmap で好きな色空間に変換できますが、それだと都合が悪いのでしょうか?
    もちろん、直接やると、パフォーマンスが出ない可能性があるので、適宜、CachedBitmapなどを挟むべきだとは思いますが。
    • by tsubu_cs (46098) on 2014年06月08日 10時30分 (#2617272) 日記

      アドバイスありがとうございます。

      すいません、よく分かってないのですが、方法1, 2でそれを
      使う場合、一度各色8bitにした後16bitにしてしまい、情報落ち
      が発生すると思ったのですが、私の誤解でしょうか。

      情報落ちが発生する場合は、ポリシーの 2に反するため
      なるべく採用したくない方法となります。

      親コメント
typodupeerror

※ただしPHPを除く -- あるAdmin

読み込み中...