それはすべて、Stackoverflowで見つけた非常に便利なコードから始まりました。
次に、独自の調整を行い、このメソッドに画像のサイズ変更を追加することにしました。ただし、この問題に苦労した後、「パラメータが無効です」という情報が表示されます。
また、エラーにもかかわらず、画像が正常にアップロードされていることを強調したいと思います。ただし、意図したとおりに最適化されていません。
これは私の「アップロードボタン」のコードの一部です。
fuOne.SaveAs(Server.MapPath("~/imgFolder/temp/") + fuOne.FileName);
System.Drawing.Image imgUploaded = System.Drawing.Image.FromFile(Server.MapPath("~/imgFolder/temp/") + fuOne.FileName);
SaveJpeg(Server.MapPath("~/imgFolder/temp/") + fuOne.FileName, imgUploaded, 60, 300, 300);
これは私のSaveJpegメソッドの完全なコードです:
public static void SaveJpeg(string path, System.Drawing.Image imgUploaded, int quality, int maxWidth, int maxHeight)
{
if (quality < 0 || quality > 100)
throw new ArgumentOutOfRangeException("quality must be between 0 and 100.");
// resize the image
int newWidth = imgUploaded.Width;
int newHeight = imgUploaded.Height;
double aspectRatio = (double)imgUploaded.Width / (double)imgUploaded.Height;
if (aspectRatio <= 1 && imgUploaded.Width > maxWidth)
{
newWidth = maxWidth;
newHeight = (int)Math.Round(newWidth / aspectRatio);
}
else if (aspectRatio > 1 && imgUploaded.Height > maxHeight)
{
newHeight = maxHeight;
newWidth = (int)Math.Round(newHeight * aspectRatio);
}
Bitmap newImage = new Bitmap(imgUploaded, newWidth, newHeight);
Graphics g = Graphics.FromImage(imgUploaded);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
g.DrawImage(imgUploaded, 0, 0, newImage.Width, newImage.Height);
g.Dispose();
imgUploaded.Dispose();
// Lets start to change the image quality
EncoderParameter qualityParam =
new EncoderParameter(Encoder.Quality, quality);
// Jpeg image codec
ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
System.Drawing.Image imgFinal = (System.Drawing.Image)newImage;
newImage.Dispose();
imgFinal.Save(path, jpegCodec, encoderParams);
imgFinal.Dispose();
}
/// <summary>
/// Returns the image codec with the given mime type
/// </summary>
private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
// Get image codecs for all image formats
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
// Find the correct image codec
for (int i = 0; i < codecs.Length; i++)
if (codecs[i].MimeType == mimeType)
return codecs[i];
return null;
}
ファローアップ
コードにいくつかのエラーがあったようです。1つはエンコードに、もう1つは画像保存に使用されます。
Aristosのフォローアップは、この問題を解決するために非常に重要です。これは、ファイルを保存するときの私のひどい間違いを修正するためです。