tsubu_csの日記: 続、WPFを使った画像の加工方法で悩む 2
画像ファイルを加工(回転、クロップ) について模索しているという話で、
現状までの試行錯誤の過程が以下。
理想というかなるべく守りたいポリシー :
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秒前後)
なかなかうまくいきませんなぁ…… (遠い目
PixelFormatの変換 (スコア:0)
もちろん、直接やると、パフォーマンスが出ない可能性があるので、適宜、CachedBitmapなどを挟むべきだとは思いますが。
Re:PixelFormatの変換 (スコア:1)
アドバイスありがとうございます。
すいません、よく分かってないのですが、方法1, 2でそれを
使う場合、一度各色8bitにした後16bitにしてしまい、情報落ち
が発生すると思ったのですが、私の誤解でしょうか。
情報落ちが発生する場合は、ポリシーの 2に反するため
なるべく採用したくない方法となります。