0

高さと幅が元の画像と同じである場合に画像のサイズ変更を回避して画像を処理する方法(param)はありますか?

そうでない場合、プラグインのスケールプロセスをどこでどのようにキャンセルしますか?

4

1 に答える 1

0

ImageResizerは、すでに適切なサイズの画像を拡大縮小しません。ただし、それらをデコードし、メタデータを取り除き、Web互換でWeb効率の高い形式(通常はjpgまたはpng)に再エンコードします。

ImageResizerに元のファイルを提供させ、プロセス全体をスキップしたい場合、それは別の質問です。これについては、以下で回答します。

その目標の主な課題は次のとおりです。ソース画像ファイルの幅と高さを検出するには、少なくとも部分的にデコードする必要があります。

この最適化は、限られた状況でのみ有用(または可能)です

  1. ソースファイルの形式を使用すると、ファイル全体をメモリにロードせずに幅と高さを解析できます。JPG / PNGはい、TIFF-いいえ、FreeImageDecoderでサポートされている30以上の形式、いいえ。
  2. ソースファイルはローカルの低遅延ディスクストレージにあり、IISアクセス可能です-UNCパスとプラグインS3Reader、SqlReader、AzureReader、RemoteReader、MongoReaderなどを排除します。
  3. URL書き換えルールはありません。
  4. カスタムプラグインは使用されていません。
  5. 画像は、メタデータが削除された、適切な圧縮設定を備えたWeb最適化形式になっています。
  6. 他のURLコマンドは使用されていません
  7. 透かしのルールはありません。
  8. キャッシュヘッダーを制御する必要はありません。
  9. 画像が悪意のあるものではないことを100%確信しています(再エンコードしないと、ファイルがスクリプトとビットマップの両方にならないようにすることはできません)。

さらに、結果をキャッシュしない限り、この「最適化」は実際には応答時間やサーバー側のパフォーマンスを改善しません。ディメンションデータは個別にデコードする必要があるため、ディメンションが一致したかどうかに関係なく、すべてのリクエストに均一で大きなオーバーヘッドが追加されます。

これが役立つと思う唯一の状況は、Photoshopでの圧縮の最適化に多くの時間を費やし、必要な場合を除いてImageResizerがそれに触れたくない場合です。心配な場合は、そのシナリオでURLを適用しないでください。または、process=no元のバイトをそのまま保持するように設定します。

これを行うためのプラグインを作成することは間違いなく可能です。しかし、それは多くの人が使いたいと思うものではなく、それが純利益になるような使用シナリオを想像することはできません。

先に突入したい場合は、イベントを処理し、によって返されたストリームを解析するコードにConfig.Current.Pipeline.PreHandleImage置き換えて、ディメンションロジックを適用します(と比較して、ストリームをリセットし、必要に応じて次のように逐語的にコピーします。e.ResizeImageToStreame.GetSourceImage()Config.Current.GetImageBuilder().GetFinalSize()

 using (Stream source = e.GetSourceImage())
     StreamExtensions.CopyToStream(source,stream); //4KiB buffer

これは、画像のサイズを実際に1ピクセル小さくする必要があるが、1ピクセルの境界線を追加するなど、特定のシナリオでは処理されない場合がありますが、近いです。気になる場合は、GetFinalSizeのソースコードを見て、キャンバスの境界ではなく画像の境界を返します。

于 2012-06-20T14:53:14.263 に答える