私はこのプログラムを画像の明るさを調整する機能を追加するのにlinkと使います。このコードは問題ありませんが、明るさを調整するには時間がかかります(画像ファイルのサイズは1.8MB)。低品質の画像を試してみると、即座に画像(画像ファイルのサイズ100KB)が調整されます。画像の明るさを調整する効率的な方法はありますか?大きな画像の明るさ画像C#
答えて
コードは、Bitmaps
にGetPixel
とSetPixel
を使用しているようです。それは遅いので、これは悪い考えです。
Bitmap
の1つのピクセルを操作するには、ロックされている必要があります(Get/SetPixelは裏で行います)。ピクセル単位で行うことは、1000x1000サイズのイメージでは、ロック/実行されます。これは膨大なオーバーヘッドを生み出します。これを回避する
方法1
一つの方法は、LockBits
機能でビットマップ全体をロックすることです。これで、ピクセルをループして変更することができます。この方法について
2つのノート:
我々は今、アクセスそれは別に、各チャンネルで、各ピクセルの生のバイトは何をしている:BGRまたはBGRAのいずれか、ピクセルフォーマットに依存します。これは、チャンネルがであり、通常のRGB/ARGBフォーマットのColorメソッドから物理的に逆転されてであることを意味します。
物理ビットマップピクセル行をループするには、各行に
stride
を追加する必要があります。この場合、行は4バイトの倍数になります。またsee here
は、いくつかの例については、あなたはsome of these posts上で閲覧することもできます。柔軟な操作を可能にするためにデリゲートを使用する特にthis oneに注意してください。
(それらが画像を合成することを目指しているため、ポストのいくつかは、2つのあるいは3ロックビットマップを使用することに注意してください。)
方法二
ピクセルのいずれかをロックするオーバーヘッドを回避する別の方法1つは、自分自身を全体としてロックすることによって助けられる既製のビットマップクラスです。 Hereとhereは私が自分自身を試していない例です。
方法3
最後の両方ではなく、シンプルで本当に速いです画像操作のための非常にエレガントな方法があります。最高の結果を得るために専門的にも作られています:ColorMatrix
を設定できます。
明るさ、ガンマ、色相を変更したり、一部を変更することができます。 Here is a very nice introduction。
唯一の欠点は固定操作に限られているため、photoshop-type layer modesなどの他のファンシーなもののカスタムフィルタを作成することはできません。特に、隣接するピクセルを処理する必要があるフィルタなどがあります。ぼかしのために..
明るさの変更が必要な場合は、これをおすすめします。
- 1. C++サブ画像用の大きな画像の検索ブロック
- 2. 大きな画像に画像をコピー
- 3. 大きな画像の上に小さな画像
- 4. 画像を大きな画像の小さな領域にスワップ
- 5. Java OpenCVレイヤーの小さな画像を透明な画像に拡大
- 6. 大きな画像と小さい画像のテキスト
- 7. カイロの大きな画像
- 8. 大きな画像のスクロール
- 9. スクリプトは、大きな画像
- 10. 大きな画像縦スクロール
- 11. ライブサムネイル/大きな画像
- 12. 大きな画像に小さな画像を表示する際の問題
- 13. 小さな画像をCakePHPの大きな画像にリンクする
- 14. 交差点の画像と不明な高さの画像
- 15. 大きなダイナミックレンジを持つ画像の画像正規化
- 16. Tutsplus画像サイズ変更クラス:大きな画像のバグ?
- 17. Twitterの画像:APIコンソールで大きな画像が表示されない
- 18. C#画像上の画像
- 19. オーバーレイ画像と別の透明画像
- 20. C#小さな画像の位置をより大きな画像の中に入れるには
- 21. Google画像:サムネイルURLから大きな画像URLを取得
- 22. Python PIL "IOError:大きな画像を含む画像ファイル"
- 23. 大きな画像のあるレスポンスNavbar
- 24. 画像の最大サイズ - 背景画像
- 25. 角度で画像を挿入する場合、画像の確認画像の大きさと高さ
- 26. 透明な画像を描画する
- 27. 画像の大きさ奇数
- 28. 画像付き透明Winform
- 29. 大きな画像をスクロールするQt
- 30. 他の画像と比較したときの画像の大きさ
さらに低レベルのアプローチを使用して編集できます。 http://www.vcskicks.com/fast-image-processing.php – leAthlon
大きな画像(100kB対1.8MB)と比較して、非常に小さい画像を扱うときは、常に違いがあります。では、この質問の解決策から何を期待していますか? – Fildor
コードは、通常のビットマップでSetPixelを使用しているようです。これはスローが遅いので、これは悪い考えです。代わりにa)LockBitsまたはb)FastBitmapまたはc)ColorMatrixを使用してください!ここにたくさんの例があります。 – TaW