【问题标题】:C# Upload image and saving as Bitmap Increase size of the imageC#上传图像并保存为位图增加图像的大小
【发布时间】:2016-01-26 16:27:42
【问题描述】:

为了上传图片,我在客户端使用 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();”读取位我得到了 2.35MB 的“位”。

谁能告诉我在我将图像保存为位图后增加图像大小的原因是什么?我需要位图,因为我需要检查上传图像的高度和高度,并在需要时调整它的大小。

【问题讨论】:

  • 更改文件格式会改变数据的大小,因为不同的图像格式类型存储图像数据的方式不同。

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


【解决方案1】:

答案很简单,无论图像以前采用何种格式,位图都会占用更多内存,因为它是未压缩的,保存后它会保持未压缩的格式。

【讨论】:

    【解决方案2】:

    jpeg、png、gif 等都是压缩的,因此比未压缩的位图使用更少的字节。

    如果只想保存原图,直接保存file.InputStream即可。

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

    【讨论】:

    • 我可以再压缩Bitmap吗?
    • 您应该可以拨打newImage.Save("file.png", ImageFormat.Png);ImageFormat.Jpg
    【解决方案3】:

    这里的目标是什么?你只是想上传一张图片吗?它是否需要作为图像进行验证?还是您只是想上传文件?

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

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

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

     var format = oldImage.RawFormat;
    

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

    如果您想检查图像是否为空等,您可以尝试此页面(http://www.codeproject.com/Articles/1956/NET-Image-Uploading),但要意识到它仍然将其放入图像中,如果您只是想这样做,这不是您的愿望“按原样”保存。

    【讨论】:

    • 是的,我只是想上传一张图片,它不需要验证为图片。但我保存的原因是 Bitmap 是这样我可以检查图像的宽度和高度,如果宽度 > 800 或高度 > 2000 则调整它的大小。请再次检查我的问题,我编辑了它
    • 你是否只在它太小时才调整大小?或者你也在调整大小。看起来你总是将大小调整为 800 x 2000。如果图像更小,一旦调整大小就会更大。这是算法的一部分。顺便说一句,我会小心使用 .NET 位来调整大小,因为它们会留下工件。如果需要调整大小,那么我会考虑一个更好的图像库,这样图像就很清晰了。因为你有 raw,你会遇到更少的问题,但你也会处理更大的图像。
    • 我只在 iz 太大时才调整它的大小。如果它太小,永远不要。因此,如果宽度大于 800 或高度大于 2000,原始图像将被调整为更小的图像。否则它根本不会调整大小。当它没有调整大小时,我得到了更多的位,我发现那是因为位图没有被压缩。我可以在调整大小后再次压缩它吗?
    猜你喜欢
    • 2020-01-25
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多