C#上传图像并保存为位图 增加图像尺寸

3

我在客户端使用了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保存到文件流,并使用“fileStream.ToArray();”读取位,结果我在“bits”中获得了2.35MB。

请问有人能告诉我将图片保存为位图后大小增加的原因。我需要Bitmap,因为我需要检查上传的图像的宽度和高度,如果需要,就进行调整。


更改文件格式会改变数据的大小,因为不同的图像格式类型以不同的方式存储图像数据。 - David
3个回答

0
答案很简单,位图占用的内存比之前的任何格式都要多,因为它是未压缩的,保存后仍保持在未压缩的格式中。

0

JPEG、PNG、GIF等格式都是压缩过的,因此使用的字节数比未压缩的位图少。

如果您只想保存原始图像,只需保存文件的InputStream即可。

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


我能再次压缩位图吗? - carpics
1
你应该能够调用 newImage.Save("file.png", ImageFormat.Png);ImageFormat.Jpg - wertzui

0
这里的目标是什么?你只是想上传一张图片吗?它需要被验证为图片吗?还是你只是想上传文件?
如果上传是目标,而不考虑验证,只需移动位并将其保存为文件名。一旦你这样做了...
using (var oldImage = new Bitmap(file.InputStream))

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

 var format = oldImage.RawFormat;

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

如果你想对图像是否为空等进行一些检查,你可以尝试这个页面(http://www.codeproject.com/Articles/1956/NET-Image-Uploading),但要意识到它仍然将其放在一个图像中,如果你只想“原样”保存,则不是你的需求。


是的,我只是想上传一张图片,不需要对其进行验证。但我保存为位图的原因是可以检查图像的宽度和高度,如果宽度>800或高度>2000,则可以调整大小。请再次检查我的问题,我已经编辑过了。 - carpics
你只在尺寸太小的情况下进行调整大小吗?还是也会放大尺寸?看起来你总是将图像大小调整为800 x 2000。如果图像较小,则调整大小后会变得更大。这是算法的一部分。顺便说一句,我建议谨慎使用.NET位来调整大小,因为它们会留下伪影。如果调整大小是必需的,那么我建议考虑使用更好的图像库,以使图像更清晰。由于你有原始文件,所以问题会少一些,但你也将处理更大的图像。 - Gregory A Beamer
我只会在 iz 太大的情况下进行调整大小,如果太小则不会。因此,如果宽度大于 800 或高度大于 2000,则会将原始图像调整为较小的尺寸。否则,它将不会被调整大小。当它没有被调整大小时,我会得到更多的位数,我发现这是因为 Bitmap 没有被压缩。在调整大小后,我能否再次对其进行压缩? - carpics

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接