降低图像分辨率增加文件大小

本文关键字:增加 文件大小 分辨率 图像 | 更新日期: 2023-09-27 18:01:33

我有一个MVC应用程序,你可以上传一张图片,它会被调整到最大。50 kb。我在while循环中调整大小,但问题是当我减少图片的宽度和高度时,文件大小会增加。在某一点上,尺寸变小了,但以质量为代价

    Request.InputStream.Position = 0;
    string Data = new System.IO.StreamReader(Request.InputStream).ReadToEnd();
    var Base64 = Data.Split(',')[1];
    var BitmapBytes = Convert.FromBase64String(Base64);
    var Bmp = new Bitmap(new MemoryStream(BitmapBytes));
    while (BitmapBytes.Length > 51200)
    {
        int Schritte = 20; //I tested here also with 300
        int maxWidth = Bmp.Width;
        maxWidth = maxWidth - Schritte;
        int maxHeight = Bmp.Height;
        maxHeight = maxHeight - Schritte;
        Bmp = ScaleImage(Bmp, maxWidth, maxHeight);
        var base64 = ReturnImageAsBase64(Bmp);
        BitmapBytes = Convert.FromBase64String(base64);
    }

调整大小的代码:

public static Bitmap ScaleImage(Image image, int maxWidth, int maxHeight)
{
    var ratioX = (double)maxWidth / image.Width;
    var ratioY = (double)maxHeight / image.Height;
    var ratio = Math.Min(ratioX, ratioY);
    var newWidth = (int)(image.Width * ratio);
    var newHeight = (int)(image.Height * ratio);
    Bitmap newImage = new Bitmap(newWidth, newHeight);
    using (Graphics gr = Graphics.FromImage(newImage))
    {
        gr.SmoothingMode = SmoothingMode.HighQuality;
        gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
        gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
        gr.DrawImage(image, new Rectangle(0, 0, newWidth, newHeight));
     }
     return newImage;
}

我以66964字节的大小开始。在循环的第一个回合后,它是85151字节,尽管宽度减少了300像素,高度减少了420像素。

降低图像分辨率增加文件大小

从我之前的评论:

我认为这是你的像素格式的问题。例如,如果你有一个1bpp(黑色或白色)的位图,并将其绘制到ScaleImage中的newImage中,newImage将以默认的Pixelformat(可能带有颜色)创建,因此你最终将获得24bpp,这将导致更高的内存大小。

尝试改变:

Bitmap newImage = new Bitmap(newWidth, newHeight);

Bitmap newImage = new Bitmap(newWidth, newHeight, image.PixelFormat);

编辑:由于使用索引的pixelformat似乎不可能创建图形对象,因此似乎没有简单的解决方案。

说明图片尺寸变大的原因:

原始图像:颜色查找表:

1 = Red   = 255,  0,0
2 = Black =   0,  0,0
3 = Green =   0,255,0
...
         Column    
    Row  1  2  3  4
      1  1  1  1  1
      2  1  1  1  1
      3  2  2  2  2
      4  3  3  3  3

这里16个字节用于16像素,12个字节用于查找表(1个字节用于索引号,3个字节用于每种颜色的RGB通道)所以图像的总大小是28字节

在newImage中没有查找表,所以每个像素都有完整的RGB信息:

         Column    
    Row  1            2            3            4
      1  (255,  0,0)  (255,  0,0)  (255,  0,0)  (255,  0,0)
      2  (255,  0,0)  (255,  0,0)  (255,  0,0)  (255,  0,0)
      3  (  0,  0,0)  (  0,  0,0)  (  0,  0,0)  (  0,  0,0)
      4  (  0,255,0)  (  0,255,0)  (  0,255,0)  (  0,255,0)

所以newImage的大小是3*16=48 Bytes