C#上传图像并保存为位图增加图像的大小

时间:2016-01-26 16:27:42

标签: c# asp.net asp.net-mvc bitmap

上传图片我在客户端使用plupload。然后在我控制下我有下一个逻辑:

public ActionResult UploadFile()
{
    try
    {
       var file = Request.Files.Count > 0 ? Request.Files[0] : null;
       using (var fileStream = new MemoryStream())
       {
           using (var oldImage = new Bitmap(file.InputStream))
           {
               var format = oldImage.RawFormat;
               using (var newImage = ImageUtility.ResizeImage(oldImage, 800, 2000))
               {
                  newImage.Save(fileStream, format);
               }

              byte[] bits = fileStream.ToArray();
            }
       }
    {
    catch (Exception ex)
    {
    }
}

ImageUtility.ResizeImage方法:

public static class ImageUtility
{
    public static Bitmap ResizeImage(Bitmap image, int width, int height)
    {
        if (image.Width <= width && image.Height <= height)
        {
            return image;
        }

        int newWidth;
        int newHeight;
        if (image.Width > image.Height)
        {
            newWidth = width;
            newHeight = (int)(image.Height * ((float)width / image.Width));
        }
        else
        {
            newHeight = height;
            newWidth = (int)(image.Width * ((float)height / image.Height));
        }

        var newImage = new Bitmap(newWidth, newHeight);
        using (var graphics = Graphics.FromImage(newImage))
        {
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            graphics.FillRectangle(Brushes.Transparent, 0, 0, newWidth, newHeight);
            graphics.DrawImage(image, 0, 0, newWidth, newHeight);
            return newImage;
        }
    }
}

我在这里的问题是图像尺寸增加了。 我上传了1.62MB的图像,在调用此控制器之后,如果使用Bitmap创建实例,然后将Bitmap保存到文件流并使用&#34; fileStream.ToArray()读取位;&#34;我得到2.35MB&#34; bit&#34;。

有人能告诉我在将其保存为位图后增加图像尺寸的原因是什么。我需要Bitmap,因为我需要检查上传图像的高度和高度,如果需要,请调整大小。

3 个答案:

答案 0 :(得分:0)

答案很简单,位图占用了更多的内存,无论以前的图像是什么格式,因为它在保存之后保持未压缩格式。

答案 1 :(得分:0)

jpeg,png,gif等被压缩,因此使用的字节数少于未压缩的位图。

如果您只想保存原始图像,只需保存file.InputStream。

如果需要调整大小,可以使用库来应用jpg / png / etc压缩,然后保存结果。

答案 2 :(得分:0)

这里的目标是什么?你只是想上传图片吗?是否需要将其验证为图像?或者您只是想上传文件?

如果上传是目标,不考虑验证,只需移动位并使用文件名保存它们。一旦你这样做......

using (var oldImage = new Bitmap(file.InputStream))

...您正在转换为位图。这是您告诉位图使用什么格式(原始)的地方。

 var format = oldImage.RawFormat;

如果您只想移动文件(上传),则可以将内存流运行到文件流对象并保存位。

如果你想对图像是否为空等进行一些检查,你可以尝试这个页面(http://www.codeproject.com/Articles/1956/NET-Image-Uploading),但是要意识到它仍然把它放在一个图像中,如果你只是简单的话,这不是你想要的想保存&#34;按原样#34;。