web-dev-qa-db-ja.com

どのようにHttpPostedFileBaseを画像に変換しますか?

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

そして、画像の幅と高さを取得する別のより良い方法があるかどうか教えてください。

44

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

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

返されるImageIDisposableであることに注意してください。

これを機能させるには、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);
}
95
Eamon Nerbonne

ソースが画像であり、編集が不要であることを確信している場合は、説明されているように簡単に行うことができます here

[HttpPost]
public void Index(HttpPostedFileBase file)
{
    if (file.ContentLength > 0)
    {
        var filename = Path.GetFileName(file.FileName);

        System.Drawing.Image sourceimage =
            System.Drawing.Image.FromStream(file.InputStream);
    }
}

ファイルが画像であることを保護するには、MIMEタイプの受け入れ属性を入力タグに追加して、JavaScript検証をビューに追加します

<input type="file" accept="image/*">

およびjQuery検証スクリプト

$.validator.addMethod('accept', function () { return true; });

ソリューション全体が見つかります ここ

5
Andree643