【问题标题】:Image resizing at different levels creating different size images在不同级别调整图像大小创建不同大小的图像
【发布时间】:2014-11-27 01:49:04
【问题描述】:

我在单击按钮时放置了以下代码。用户选择要上传的图片后点击按钮。

using (SD.Image OriginalImage = SD.Image.FromStream(AsyncUpload.FileContent))
        {
            decimal dRatio = (Decimal)1024 / OriginalImage.Width;
            int iScaledW = 1024;
            int iScaledH = (int)(OriginalImage.Height * dRatio);
            using (SD.Bitmap bmp = new SD.Bitmap(iScaledW, iScaledH))
            {
                bmp.SetResolution(OriginalImage.HorizontalResolution, OriginalImage.VerticalResolution);
                using (SD.Graphics Graphic = SD.Graphics.FromImage(bmp))
                {
                    Graphic.SmoothingMode =SD2.SmoothingMode.AntiAlias;
                    Graphic.InterpolationMode = SD2.InterpolationMode.HighQualityBicubic;
                    Graphic.PixelOffsetMode = SD2.PixelOffsetMode.HighQuality;
                    Graphic.FillRectangle(SD.Brushes.White, 0, 0, iScaledW, iScaledH);
                    Graphic.DrawImage(OriginalImage, 0, 0, iScaledW, iScaledH);
                    bmp.Save(Path.Combine(Server.MapPath(upPath), AsyncUpload.FileName));
                }
            }
        }

这里的 AsyncUpload 是 FileUpload 控件的名称。原始图像为 3.96MB,通过使用上述函数调整图像大小,可创建 1.92MB 大小的图像。

但是,如果我选择相同的 3.96MB 文件作为单击执行以下代码的按钮,该代码只会上传所提供的任何内容。

objfile.SaveAs(Path.Combine(Server.MapPath(upPath), AsyncUpload.FileName));

然后单击一个按钮,该按钮执行与上述重新调整图像大小相同的处理,它只创建一个 200KB 的图像。下面是那个按钮点击的代码。

static byte[] Crop(string Img, int Width, int Height, int X, int Y)
    {
        int w = Width;
        int h = Height;
        int xx = X;
        int yy = Y;

        try
        {
            using (SD.Image OriginalImage = SD.Image.FromFile(Img))
            {
                if (w == 0 || h == 0)
                {
                    w = OriginalImage.Width;
                    h = OriginalImage.Height;
                }

                int iScaleX = 0, iScaleY = 0;
                GetImageResolution(w, h, out iScaleX, out iScaleY);
                using (SD.Bitmap bmp = new SD.Bitmap(iScaleX, iScaleY))
                {
                    bmp.SetResolution(OriginalImage.HorizontalResolution, OriginalImage.VerticalResolution);
                    using (SD.Graphics Graphic = SD.Graphics.FromImage(bmp))
                    {
                        Graphic.SmoothingMode = SmoothingMode.AntiAlias;
                        Graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
                        Graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
                        Graphic.FillRectangle(SD.Brushes.White, 0, 0, iScaleX, iScaleY);
                        Graphic.DrawImage(OriginalImage, 0, 0, iScaleX, iScaleY);
                        bmp.Save(<Path>);
                    }

                }

            }

        }
        catch (Exception Ex)
        {
            return null;
            //  throw (Ex);
        }

    }

两个代码相同,但输出图像的大小不同,而且大小也有很大差异。请帮助我理解为什么会出现这种行为。我想通过将它们作为流读取并在将它们上传到磁盘之前重新调整它们的大小来避免上传大尺寸的图像。但是重新调整大小后的尺寸太大了,无法接受。

另外,如果有人可以分享他们对如何压缩和图像的想法。

提前致谢

【问题讨论】:

  • 您想在上传图片之前检查其大小?
  • 如果你使用imageresizing.net,你可能会有更好的运气

标签: c# asp.net .net image


【解决方案1】:

当图像尺寸和内容相同时,文件大小差异如此大(1.92MB 到 200KB)的最可能原因是压缩类型。

这两个功能之一很可能是保存无损 PNG,可能默认为每像素 32 位,这会产生大文件。

另一种可能会保存 24 位有损 JPEG,这样几乎所有图像的尺寸都要小得多。

要对此进行测试,请使用以下代码强制格式为 JPEG:

bmp.Save(Path.Combine(Server.MapPath(upPath), AsyncUpload.FileName), SD.Imaging.ImageFormat.Jpeg);

这会产生更小的文件吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2018-08-03
    相关资源
    最近更新 更多