私はSystem.Drawing
クラスを使用して、ユーザーがアップロードした写真からサムネイルと透かし入り画像を生成しています。ユーザーは、オリジナルをアップロードした後、jCropを使用して画像をトリミングすることもできます。私はこのコードを他の誰かから引き継いでおり、単純化して最適化しようとしています(トラフィックの多いWebサイトで使用されています)。C#での効率的な画像操作
以前の人は、パラメータとしてビットマップを受け取った静的メソッドを持っていて、Graphics
オブジェクトを内部的に割り当て、廃棄しました。私の理解では、インスタンスは画像全体をメモリに格納していますが、Graphics
は基本的に描画操作のキューであり、それは冪等元です。次のように
プロセスは、現在動作します:
- は、画像を受信し、一時ファイルに保存します。
- 作物座標を受け取ります。
- 元のビットマップをメモリにロードします。
- オリジナルから新しいビットマップを作成し、クロッピングを適用します。
- 多分、新しいビットマップ上で調整するいくつかのクレイジー・お尻の明るさを行い、新たなビットマップを返します(私はむしろ、この手を触れないと思います!;ポインタ算術演算はたくさんある)(?)から、別のビットマップを作成します
- このA.を呼び出すことができます透かし(このB1を呼び出すことができます)
- を適用した一つは、A.
- から175x175サムネイルビットマップを作成します。これは、メモリの割り当ての多くのように思えるA.
から45x45のサムネイルビットマップを作成します。私の質問はこれです:実際にパイプラインを作成して、コードの一部を書き換えてGraphics
インスタンスを再利用することをお勧めしますか?実際には、メモリに1つのイメージ(オリジナルのアップロード)しか必要としませんが、残りはディスクに直接書き込むことができます。生成されたすべてのイメージには、クロップおよび輝度の変換、およびそのバージョンに固有の単一の変換が必要となり、効果的に操作のツリーが作成されます。
ご意見やご提案はありますか?
ああ、私は実際に.NETで実際に作業していることに言及する必要があります。私が言うことが混乱していると思われる場合は、私に負担をかけてヒントを教えてください。
これは、.NETとの最初のやりとりであることは残念です。 IDisposableパターンは、フレームワークに関する私の本当の唯一の永続的な不満です。この '使用する'ビジネスは、最も難解な、定期的に使用される機能です。ほとんどのものは非常に簡単です。 – overslacked
良い質問、私は言う! +1 – Cerebrus
私は「冪等級」を見なければなりません...良い言葉。 – JasonRShaver