0

MVC3 アプリからアップロードした画像のサイズを変更しようとしています。以下のコードは、指定されたパラメーターに基づいて目標サイズに基づいて画像のサイズを変更できますが、最終結果は粗い画像になります。ここで、stackoverflow と msn のサンプルでさまざまなソリューションを試しましたが、すべてが粗い画像を返します。

static public Image ResizeFile(HttpPostedFileBase file, int targeWidth, int targetHeight)
    {
        Image originalImage = null;
        bool IsImage = true;
        Bitmap bitmap = null;

        try
        {
            originalImage = Image.FromStream(file.InputStream, true, true);
        }
        catch
        {
            IsImage = false;
        }

        if (IsImage)
        {
            //accept an image only if it is less than 3mb(max)
            if (file.ContentLength <= 3145728)
            {
                var newImage = new MemoryStream();
                Rectangle origRect = new Rectangle(0, 0, originalImage.Width, originalImage.Height);

                // if targets are null, require scale. for specified sized images eg. Event Image, or Profile photos.
                int newWidth = 0;
                int newHeight = 0;

                //if the width is greater than height
                if (originalImage.Width > originalImage.Height)
                {
                    newWidth = targeWidth;
                    newHeight = targetHeight;
                    bitmap = new Bitmap(newWidth, newHeight);
                }

                //if the size of image is larger than either one of the target size
                else if (originalImage.Width > targeWidth || originalImage.Height > targetHeight)
                {
                    newWidth = targeWidth;
                    newHeight = targetHeight;
                    bitmap = new Bitmap(newWidth, newHeight);
                }
                //reuse old dimensions
                else
                {
                    bitmap = new Bitmap(originalImage.Width, originalImage.Height);
                }

                try
                {
                    using (Graphics g = Graphics.FromImage((Image)bitmap))
                    {
                        g.SmoothingMode = SmoothingMode.AntiAlias;
                        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
                        g.CompositingQuality = CompositingQuality.HighQuality;
                        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                        g.DrawImage(originalImage, new Rectangle(0, 0, newWidth, newHeight),
                            0,
                            0,           // upper-left corner of source rectangle
                            originalImage.Width,       // width of source rectangle
                            originalImage.Height,      // height of source rectangle
                            GraphicsUnit.Pixel);
                        bitmap.Save(newImage, ImageFormat.Jpeg);
                    }
                }
                catch (Exception ex)
                {   // error before IDisposable ownership transfer
                    if (bitmap != null)
                        bitmap.Dispose();

                    logger.Info("Domain/Utilities/ImageResizer->ResizeFile: " + ex.ToString());

                    throw new Exception("Error resizing file.");
                }
            }                
        }

        return (Image)bitmap;
    }

UPDATE 1 はパラメーターとエンコーダーを削除し、現在は .jpeg で保存しています。しかし、まだ粒子の粗い画像が生成されます。

4

1 に答える 1

0

いくつかの提案

1) 画像を拡大していないことを確認します。

2) g.SmoothingMode = Drawing2D.SmoothingMode.AntiAliasHighQuality の代わりに試す

上記に失敗した場合、上記以外の他のすべてのオプション設定を削除し、次を使用してファイルを保存するだけです。

bitmap.Save(newImage, Imaging.ImageFormat.Jpeg);

上記が完全にうまく機能することがわかりました。

于 2012-09-01T07:42:31.577 に答える