2012-05-08 18 views
5

最近、我々のASP.NET MVC 4アプリケーションで画像を動的にサイズ変更するために、GDI +でImageResizer.Netを使用し始めました。ImageResizer.netを使用して画像の現在のサイズを確認

イメージの実際の解像度(DPI、PPI、何でもそれを呼び出す)、イメージ(バイト配列として読み込まれる)を決定する方法はありますか。必要なときに我々は現在、指定された低解像度に画像のサイズを変更するには、このようなワークフローを持っている:

//pseudo-code 
var image = (Bitmap)Bitmap.FromStream(contentStream) 
var resX = image.HorizontalResolution; 
var resY = image.VerticalResolution; 
//calculate scale factor 
//determine newHeight and newWidth from scale 
var settings = new ResizeSettings("width={newWidth}&height={newHeight}") 
var newImage = ImageBuilder.Current.Build(image, someNewImage, settings); 

これはうまく動作しますが、そのGDI +とImageResizerを混合し、同じデータのストリーム開閉をたくさん持っています(実際のコードは少し冗長で、多くのusingステートメントがあります)。

ImageResizerだけで水平解像度と垂直解像度を判断する方法はありますか?私はすぐにドキュメントで何かを見つけることができませんでした。

当面は、管理対象APIを使用しましたが、最終的にMVCルーティングが使用されます。

+0

は典型的には、埋め込まれたDPI値が正しくないか価値です。あなたがcertianイメージフォーマットだけを使用していて、それらがどのようにエンコードされているかを正確に制御していない限り、私はあなたが計算にそれらを頼りにする方法を見ません。あなたの使用シナリオについてもう少し説明できますか? –

+0

当社は、特定の方法でアクセスされた場合、max-96dpi画像のみを提供する契約上の義務を負います。これを達成するには、イメージをそのdpiでのサイズに縮小し、次にBitmapクラスで解像度を設定します。これはPNG画像とJPG画像の両方で動作するように思われます。スケーリングが必要な画像のソースは知られています(つまり、ユーザーはアップロードしていません) –

答えて

3

これはかなり非定型シナリオである - 通常着信DPI値は無価値です。

しかし、それらの値を制御し、サイズの計算を実行する必要があると思われるので、私はプラグインを提案します。これらは簡単で、作業を重複しないので理想的なパフォーマンスを提供します。

public class CustomSizing:BuilderExtension, IPlugin { 

    public CustomSizing() { } 

    public IPlugin Install(Configuration.Config c) { 
     c.Plugins.add_plugin(this); 
     return this; 
    } 

    public bool Uninstall(Configuration.Config c) { 
     c.Plugins.remove_plugin(this); 
     return true; 
    } 
    //Executes right after the bitmap has been loaded and rotated/paged 
    protected override RequestedAction PostPrepareSourceBitmap(ImageState s) { 
     //I suggest only activating this logic if you get a particular querystring command. 
     if (!"true".Equals(s.settings["customsizing"], 
      StringComparison.OrdinalIgnoreCase)) return RequestedAction.None; 

     //s.sourceBitmap.HorizontalResolution 
     //s.sourceBitmap.VerticalResolution 

     //Set output pixel dimensions and fit mode 
     //s.settings.Width = X; 
     //s.settings.Height = Y; 
     //s.settings.Mode = FitMode.Max; 

     //Set output res. 
     //s.settings["dpi"] = "96"; 
     return RequestedAction.None; 
    } 
} 

code or via Web.Configからインストールできます。

新しいCustomSizing()。インストール(Config.Current);

又はresizer's configuration sectionで:

<plugins> 
    <add name="MyNamespace.CustomSizing" /> 
    </plugins> 
+0

私たちはまだこの機能を実装していませんが、これは最も簡単で確実な方法です。答えはすべての必要な情報を提供するようです。ありがとう –

関連する問題