C# 生成高清缩略图

对于GDI+,在正常的操作,Bitmap-- Graphcis -- DrawImage或者DrawString ,生成图片的话,会产生很多杂点,或者是图片质量不稳定..尤其是在读取图片后,生成缩略图之后,文件会被压缩而失真..

主要原因是因为没有重新设置Graphics的几个属性..

1.Graphics.SmoothingMode属性: 例如SmoothingMode.HighQuality可以产生高质量图片,但是效率低.

2.Graphics.CompositingQuality 属性: 例如:CompositingQuality.HighQuality也是产生高质量图,效率低下.

3.Graphics.InterpolationMode 属性,例如:InterpolationMode.HighQualityBicubic与前两个也是同样的效果.

这三个属性的值都是enum,具体的enum参数可以查看MSDN的说明..在这里就我不赘述..
如果是对图片进行放大,缩小,可以调整Graphics.CompositingQuality Graphics.InterpolationMode 两个属性..如果是图片生成,则可以调整Graphics.SmoothingMode属性

 

 

/// <summary>
/// 生成缩略图
/// </summary>
/// <param name="fileName">原图路径</param>
/// <param name="newFile">缩略图路径</param>
/// <param name="maxHeight">最大高度</param>
/// <param name="maxWidth">最大宽度</param>
public string ThumbnailImage(string fileName, string newFile, int maxHeight, int maxWidth)
{
    System.Drawing.Image img = System.Drawing.Image.FromFile(fileName);
    System.Drawing.Imaging.ImageFormat thisFormat = img.RawFormat;
    //缩略图尺寸
    double w = 0.0;
    double h = 0.0;
    double sw = Convert.ToDouble(img.Width);
    double sh = Convert.ToDouble(img.Height);
    double mw = Convert.ToDouble(maxWidth);
    double mh = Convert.ToDouble(maxHeight);
    if (sw < mw && sh < mh)
    {
        w = sw;
        h = sh;
    }
    else if ((sw / sh) > (mw / mh))
    {
        w = maxWidth;
        h = (w * sh) / sw;
    }
    else
    {
        h = maxHeight;
        w = (h * sw) / sh;
    }
    Size newSize = new Size(Convert.ToInt32(w), Convert.ToInt32(h));
    Bitmap outBmp = new Bitmap(newSize.Width, newSize.Height);
    Graphics g = Graphics.FromImage(outBmp);
    //设置画布的描绘质量
    g.CompositingQuality = CompositingQuality.HighQuality;
    g.SmoothingMode = SmoothingMode.HighQuality;
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    g.DrawImage(img, new Rectangle(0, 0, newSize.Width, newSize.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
    g.Dispose();
    //以下代码为保存图片时,设置压缩质量
    EncoderParameters encoderParams = new EncoderParameters();
    long[] quality = new long[1];
    quality[0] = 100;
    EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
    encoderParams.Param[0] = encoderParam;
    //获得包含有关内置图像编码解码器的信息的ImageCodecInfo 对象.
    ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
    ImageCodecInfo jpegICI = null;
    for (int x = 0; x < arrayICI.Length;x++)
    {
        if (arrayICI[x].FormatDescription.Equals("JPEG"))
        {
            jpegICI = arrayICI[x];
            //设置JPEG编码
            break;
        }
     }
     if (jpegICI != null)
     {
         Bitmap newbit = new Bitmap(outBmp);
         newbit.Save(newFile, jpegICI, encoderParams);
     }
     else
     {
         outBmp.Save(newFile,
         thisFormat);
     }
     img.Dispose();
     outBmp.Dispose();
     return newFile;
}

 

posted on 2014-01-07 17:01  美食塔  阅读(433)  评论(0)    收藏  举报

导航