博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C#]解决生成的缩略图模糊的问题
阅读量:6867 次
发布时间:2019-06-26

本文共 2536 字,大约阅读时间需要 8 分钟。

一、问题场景

针对一张正方形图片生成 48px × 48px 的缩略图并保存为图片文件,但发现生成的缩略图很模糊。

生成的模糊的缩略图如下:

原始图片(300px × 300px, png格式):

代码中调用的是 System.Drawing.Image. GetThumbnailImage() 方法,主要实现代码如下:

private void SaveThumbnail(Bitmap bitmap, int width, int height, string directory, string filename, string extension){    var physicalPath = directory + filename + extension;    using (var thumbnail = bitmap.GetThumbnailImage(width, height, () => { return true; }, IntPtr.Zero))    {        using (var encoderParameters = new EncoderParameters(1))        {            encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);            thumbnail.Save(physicalPath,                        ImageCodecInfo.GetImageEncoders()                            .Where(x => x.FilenameExtension.Contains(extension.ToUpperInvariant()))                            .FirstOrDefault(),                        encoderParameters);        }    }           }

二、解决方法

改为调用 System.Drawing.Graphics.DrawImage() 方法, 主要实现代码如下:

private void SaveThumbnail(Bitmap originBitmap, int width, int height, string directory, string filename, string extension){    var physicalPath = directory + filename + extension;                using (var newImage = new Bitmap(width, height))    {        using (var graphic = GetGraphic(originBitmap, newImage))        {            graphic.DrawImage(originBitmap, 0, 0, width, height);            using (var encoderParameters = new EncoderParameters(1))            {                encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);                newImage.Save(physicalPath,                            ImageCodecInfo.GetImageEncoders()                                .Where(x => x.FilenameExtension.Contains(extension.ToUpperInvariant()))                                .FirstOrDefault(),                            encoderParameters);            }        }    }            }private Graphics GetGraphic(Image originImage, Bitmap newImage){    newImage.SetResolution(originImage.HorizontalResolution, originImage.VerticalResolution);    var graphic = Graphics.FromImage(newImage);    graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;    graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;    graphic.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;    graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;    return graphic;}

 生成的缩略图效果如下:

三、参考资料

转载于:https://www.cnblogs.com/dudu/archive/2013/01/16/resize-image.html

你可能感兴趣的文章
NagiosQL添加监控主机及Nagios上启用报警机制
查看>>
我的友情链接
查看>>
Tomcat 监控及远程日志查看工具psi-probe
查看>>
学习Visual C++实例精通 第14章 网络开发
查看>>
前端小报14-11-9
查看>>
Java解析文件内容
查看>>
掌握基于消息与.Net Remoting的分布式处理架构相关详细知识
查看>>
当笔记本的运行速度跟不上我写程序的思路后【只建议无聊放松者看看】
查看>>
Apache Shiro学习笔记(二)身份验证-自定义Realm
查看>>
用Python实现的数据结构与算法:基本搜索
查看>>
一位企业高管带来的感言关于——Polylink IPBX
查看>>
取三个数字最大值
查看>>
thinkphp-query
查看>>
SQL-53 按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees...
查看>>
EF6 秘籍 2th:Entity Framework 入门(一)EF诞生的背景
查看>>
GCC 参数详解
查看>>
MongoDB日志切换(Rotate Log Files)指南
查看>>
Linux磁盘分区实战案例
查看>>
squid 3.2 的高级应用-用户认证
查看>>
01_Linux学习
查看>>