在C#中为asp.net Web窗体调整图像大小时图像质量丢失

本文关键字:图像 小时 图像质量 调整 窗体 中为 asp net Web | 更新日期: 2023-09-27 18:29:36

我正在尝试调整图像的大小,并使用以下代码段保存它。它运行良好,但一些图像在调整大小后会失去质量。当我检查时,原始图像看起来很好,只有调整大小的图像质量很低。我不知道如何在调整图像大小的同时提高图像质量。

System.Drawing.Image NewImage = FullsizeImage.GetThumbnailImage(NewWidth, MaxHeight, null, IntPtr.Zero);
// Clear handle to original file so that we can overwrite it if necessary
FullsizeImage.Dispose();
// Save resized picture
//NewImage.Save(NewFile);
if (fileExtension.ToLower() == ".jpg" || fileExtension.ToLower() == ".jpeg")
{
      NewImage.Save(NewFile, System.Drawing.Imaging.ImageFormat.Jpeg);
}

请帮帮我。谢谢。

在C#中为asp.net Web窗体调整图像大小时图像质量丢失

您可以使用这个类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
using System.Drawing.Drawing2D;
/// <summary>
/// Summary description for ResizeImage
/// </summary>
public class ResizeImage
{
    public static Image Resize(Image imgToResize, int h, int w)
    {
        Size size = new Size(w, h);
        int sourceWidth = imgToResize.Width;
        int sourceHeight = imgToResize.Height;
        float nPercent = 0;
        float nPercentW = 0;
        float nPercentH = 0;
        nPercentW = ((float)size.Width / (float)sourceWidth);
        nPercentH = ((float)size.Height / (float)sourceHeight);
        if (nPercentH < nPercentW)
            nPercent = nPercentH;
        else
            nPercent = nPercentW;
        int destWidth = (int)(sourceWidth * nPercent);
        int destHeight = (int)(sourceHeight * nPercent);
        Bitmap b = new Bitmap(destWidth, destHeight);
        Graphics g = Graphics.FromImage((Image)b);
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
        g.Dispose();
        return (Image)b;
    }
}

此外,您可以使用此代码来选择图像质量:

graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphic.SmoothingMode = SmoothingMode.HighQuality; 
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphic.CompositingQuality = CompositingQuality.HighQuality;

就像这里。

随着图像大小的调整,您还应该记住更多的事情(经验法则,而不是福音,因为这取决于您正在做什么等)…

  • 将你能拿到的最大图像存储在Db(或任何地方)中(并且提供你的Db/存储可以允许这样做)。也就是说,你可以动态制作缩略图或缓存它们或其他什么,但最大的图像是"原始模型"
  • 缩小规模——如果可能的话——不要扩大规模,因为这永远不会那么好
  • 保持图像的"比例"
  • 要小心图像操作,必须正确操作以避免添加噪声等
  • 你使用的图像格式(用于保存或临时格式等)也非常重要,这也可能破坏你的图像,因为不同的格式有不同的算法,并使/牺牲图像的不同参数(无论是颜色还是细节等)
  • 尽可能少地使用"转换"-所以保持原始,对其进行简单的缩放-并尽可能地保存在内存中,例如不要保存/加载等

希望这能有所帮助,