ASP.NET MVCを使用していますが、ファイルをアップロードするアクションがあります。ファイルは適切にアップロードされています。しかし、私は画像の幅と高さを求めています。最初にHttpPostedFileBase
をImage
に変換してから続行する必要があると思います。それ、どうやったら出来るの?
そして、画像の幅と高さを取得する別のより良い方法があるかどうか教えてください。
私は Image.FromStream
を次のように使用します:
Image.FromStream(httpPostedFileBase.InputStream, true, true)
返されるImage
はIDisposable
であることに注意してください。
これを機能させるには、System.Drawing.dll
への参照が必要であり、Image
はSystem.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として保存」エンコーダーは品質管理を公開せず、ひどく低いデフォルト品質を選択します。
ただし、手動でエンコーダを選択することもできます。その後、任意のパラメータを渡すことができます。
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);
}
ソースが画像であり、編集が不要であることを確信している場合は、説明されているように簡単に行うことができます 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; });
ソリューション全体が見つかります ここ