Asp.net 以 kb 为单位缩小图像大小

Posted

技术标签:

【中文标题】Asp.net 以 kb 为单位缩小图像大小【英文标题】:Asp.net reduced image size in kb 【发布时间】:2014-02-19 01:38:50 【问题描述】:

我发布了另一个主题,得到了一些温和的回复,但尽管答案解决了问题的质量方面,但它们在图像大小 (kb) 方面产生了另一个问题。 Asp.net image resizing quality

这就是问题所在。

我有一个 2MB 的图像,我想将其缩小到 480 像素宽度。

我使用了三种不同的方式来调整它的大小:

1) 在 Fileupload 上运行此代码:

System.IO.Stream st = FileUploadPost.PostedFile.InputStream;
myImage = System.Drawing.Image.FromStream(st);
thumb = myImage.GetThumbnailImage(newWidth, newHeight, null, System.IntPtr.Zero);
thumb.Save(myPath);

好处:以 kb 为单位的大小变小(大约 80Kb)。

缺点:视觉质量很糟糕

2) 在 Fileupload 上运行此代码(在提到的帖子中提供了解决方案):

 Bitmap newImg = new Bitmap(newWidth, newHeight,    System.Drawing.Imaging.PixelFormat.Format24bppRgb);                            
 Graphics newGraphic = Graphics.FromImage(newImg);
 newGraphic.DrawImage(myImage, 0, 0, newWidth, newHeight);
 newGraphic.Dispose();
 newImg.Save(myPath); 

优点:视觉质量很好

缺点:大小仍然很大(大约 400kb)

3) 使用 Windows Paint 软件并“手动”将图像缩小到 480px 宽度

好处:1) 和 2) 的好处 -> 视觉质量很好,大小减少到 80kb 左右

问题是:

重现第 3 项行为(良好的视觉质量和较小的 kb 大小)的代码是什么?

谢谢

【问题讨论】:

试试imageresizing.net 【参考方案1】:

尝试以下方法之一:

 Bitmap newImg = new Bitmap(newWidth, newHeight, System.Drawing.Imaging.PixelFormat.Format16bppRgb555);                            
 Graphics newGraphic = Graphics.FromImage(newImg);
 newGraphic.DrawImage(myImage, 0, 0, newWidth, newHeight);
 newGraphic.Dispose();
 newImg.Save(myPath); 

 Bitmap newImg = new Bitmap(newWidth, newHeight, System.Drawing.Imaging.PixelFormat.Format16bppArgb1555);                            
 Graphics newGraphic = Graphics.FromImage(newImg);
 newGraphic.DrawImage(myImage, 0, 0, newWidth, newHeight);
 newGraphic.Dispose();
 newImg.Save(myPath); 

 Bitmap newImg = new Bitmap(newWidth, newHeight, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);                            
 Graphics newGraphic = Graphics.FromImage(newImg);
 newGraphic.DrawImage(myImage, 0, 0, newWidth, newHeight);
 newGraphic.Dispose();
 newImg.Save(myPath); 

这只会稍微降低质量并大幅减小尺寸,但我不确定哪个会更好。

这里还有一大堆其他选项可供尝试:

http://msdn.microsoft.com/en-us/library/system.drawing.imaging.pixelformat%28v=vs.110%29.aspx

【讨论】:

嘿伙计!这真的有效!非常感谢!!!您上面的第一个选项将图像减小到 193kb(我之前得到的大小的一半)并且视觉上的质量保持不变。选项 2 和 3 出错。也会尝试其他链接。再次感谢!【参考方案2】:
   protected void Page_Load(object sender, EventArgs e)
    
        //BR**
        string filePath = "";//Source file path with image name
        int CompressLevel = 50;//Image compression leve as per our requirement
        string DestintionPath = "";//Destination file path
        string Filename = "";//Output image name to save in destination path

        Stream bmpStream = System.IO.File.Open(filePath, System.IO.FileMode.Open);
        Bitmap bmp1 = new Bitmap(bmpStream);

        ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
        System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
        EncoderParameters myEncoderParameters = new EncoderParameters(1);
        EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, CompressLevel);
        myEncoderParameters.Param[0] = myEncoderParameter;
        bmp1.Save(DestintionPath + "\\" + Filename, jpgEncoder, myEncoderParameters);
        //BR**
        bmpStream.Close();
        string lblmsg = "Compressed Sucessfully with Compression Level  " + CompressLevel.ToString() + " ";
    

    private ImageCodecInfo GetEncoder(ImageFormat format)
    
        /*/ Hope this will work.Thanks in advance /*/
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

        foreach (ImageCodecInfo codec in codecs)
        
            if (codec.FormatID == format.Guid)
            
                return codec;
            
        
        return null;
    

【讨论】:

以上是关于Asp.net 以 kb 为单位缩小图像大小的主要内容,如果未能解决你的问题,请参考以下文章

如何裁剪或调整图像大小以在 asp.net 中设置纵横比

缩小 ASP.NET 应用程序的 Html 输出

调整图像大小以存储在数据库中 - ASP.NET

如何确定 ASP.Net 缓存的总大小?

php如何获取以kb为单位的网络图像大小?

自动从 html 中删除缩进、不需要的空格(缩小)