49

ASP.NET MVCを使用していて、ファイルをアップロードするアクションがあります。ファイルは正しくアップロードされています。ただし、画像の幅と高さが必要です。最初にに変換してから続行HttpPostedFileBaseする必要があると思います。Imageそれ、どうやったら出来るの?

また、画像の幅と高さを取得する別のより良い方法があるかどうかをお知らせください。

4

2 に答える 2

106

私は次のように使用Image.FromStreamします:

Image.FromStream(httpPostedFileBase.InputStream, true, true)

が返されることに注意してImageくださいIDisposable

System.Drawing.dllこれを機能させるには への参照が必要で、これImageSystem.Drawing名前空間にあります。

画像のサイズ変更

何をしようとしているのかはわかりませんが、たまたまサムネイルなどを作成している場合は、次のようなことに興味があるかもしれません...

try {
    var bitmap = new Bitmap(newWidth,newHeight);
    using (Graphics g = Graphics.FromImage(bitmap)) {
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
        g.CompositingQuality = CompositingQuality.HighQuality;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.DrawImage(oldImage,
            new Rectangle(0,0,newWidth,newHeight),
            clipRectangle, GraphicsUnit.Pixel);
    }//done with drawing on "g"
    return bitmap;//transfer IDisposable ownership
} catch { //error before IDisposable ownership transfer
    if (bitmap != null) bitmap.Dispose();
    throw;
}

clipRectangle、新しいビットマップにスケーリングする元の画像の四角形です (手動でアスペクト比を処理する必要があります)。catch-block はIDisposable、コンストラクター内での一般的な使用法です。新しいIDisposableオブジェクトが返されるまで、その所有権を維持します (コード コメントでドキュメント化することをお勧めします)。

JPEGで保存

残念ながら、デフォルトの「jpeg として保存」エンコーダーは品質コントロールを公開しておらず、非常に低いデフォルト品質を選択しています。

ただし、エンコーダーを手動で選択することもできます。その後、任意のパラメーターを渡すことができます。

ImageCodecInfo jpgInfo = ImageCodecInfo.GetImageEncoders()
    .Where(codecInfo => codecInfo.MimeType == "image/jpeg").First();
using (EncoderParameters encParams = new EncoderParameters(1))
{
    encParams.Param[0] = new EncoderParameter(Encoder.Quality, (long)quality);
    //quality should be in the range [0..100]
    image.Save(outputStream, jpgInfo, encParams);
}
于 2009-07-23T13:28:05.723 に答える