图像在不同级别调整大小,创建不同大小的图像

时间:2014-10-02 04:47:44

标签: c# asp.net .net image

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

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);
        }

    }

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

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

提前致谢

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

这会产生较小的文件吗?