[转] [C#] 解决生成的缩略图模糊的问题

一、问题场景

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

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

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

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

 1 private void SaveThumbnail(Bitmap bitmap, int width, int height, string directory, string filename, string extension)
 2 {
 3     var physicalPath = directory + filename + extension;
 4     using (var thumbnail = bitmap.GetThumbnailImage(width, height, () => { return true; }, IntPtr.Zero))
 5     {
 6         using (var encoderParameters = new EncoderParameters(1))
 7         {
 8             encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
 9             thumbnail.Save(physicalPath,
10                         ImageCodecInfo.GetImageEncoders()
11                             .Where(x => x.FilenameExtension.Contains(extension.ToUpperInvariant()))
12                             .FirstOrDefault(),
13                         encoderParameters);
14         }
15     }
16 }

二、解决方法

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

 1 private void SaveThumbnail(Bitmap originBitmap, int width, int height, string directory, string filename, string extension)
 2 {
 3     var physicalPath = directory + filename + extension;
 4
 5     using (var newImage = new Bitmap(width, height))
 6     {
 7         using (var graphic = GetGraphic(originBitmap, newImage))
 8         {
 9             graphic.DrawImage(originBitmap, 0, 0, width, height);
10             using (var encoderParameters = new EncoderParameters(1))
11             {
12                 encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
13                 newImage.Save(physicalPath,
14                             ImageCodecInfo.GetImageEncoders()
15                                 .Where(x => x.FilenameExtension.Contains(extension.ToUpperInvariant()))
16                                 .FirstOrDefault(),
17                             encoderParameters);
18             }
19         }
20     }
21 }
22
23 private Graphics GetGraphic(Image originImage, Bitmap newImage)
24 {
25     newImage.SetResolution(originImage.HorizontalResolution, originImage.VerticalResolution);
26     var graphic = Graphics.FromImage(newImage);
27     graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
28     graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
29     graphic.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
30     graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
31     return graphic;
32 }

生成的缩略图效果如下:

三、参考资料

Cropping image using jQuery, Jcrop and ASP.NET

Resizing an Image without losing any quality

时间: 2024-10-09 00:49:57

[转] [C#] 解决生成的缩略图模糊的问题的相关文章

解决phpcms V9缩略图模糊的方法

解决V9缩略图模糊/libs/classes/image.class.php注释掉else   imagecopyresized($thumbimg, $srcimg, 0, 0, $psrc_x, $psrc_y, $width, $height,  $srcwidth, $srcheight);另将102行的$imagefun($thumbimg, $filename);修改为$imagefun($thumbimg, $filename,90);

nginx+lua+GraphicsMagick生成实时缩略图-CentOS7

背景 大多数的系统都会涉及缩略图的处理,比如新闻系统和电商系统,特别是电商系统,每个商品大图都会对应一系列尺寸的缩略图用于不同业务场景的使用.部分系统也会生成不同尺寸的缩略图以供PC.手机端.ipad端使用. 解决方案探索: 直接加载原图,使用css样式表来控制图片的宽高.显然不太合适,大家也尽量不要这样做. web程序在上传成功后,同时生成相应缩略图.这种做法效率较低,如果遇到批量导入的业务时严重影响性能.并且同步生成缩略图会占用一定量的存储空间,如果能按需生成岂不更好? 使用七牛.阿里云提供

利用FFmpeg生成视频缩略图 2.1.8

1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/builds/win32/static/ D:\ffmpeg 目录追加到系统 PATH 环境变量中; 2.运行 copy_to_ffmpeg.bat, 把 echoc.exe LED_font.ttf 文件拷贝到 D:\ffmpeg\ 目录下. echoc.exe 在CMD控制台环境下输出彩色字符; LED_font.ttf 用于输出时间戳

自动生成网页缩略图

http://www.xmlas.com/web-thumbnail-autogenerationcache.html thinkphp与jQuery 自动生成网页缩略图,布布扣,bubuko.com

c#.net 生成清晰缩略图

1 public void imgsize() 2 { 3 //本例中假定了两个变量: 4 5 String src = "c:/myImages/a.jpg"; //源图像文件的绝对路径 6 String dest = "c:/myImages/a_th.jpg"; //生成的缩略图图像文件的绝对路径 7 8 int thumbWidth = 132; //要生成的缩略图的宽度 9 int thumbHeight = 100; //要生成的缩略图的高度 10 Sy

利用FFmpeg生成视频缩略图 2.3.1

1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/builds/win32/static/ D:\ffmpeg 目录追加到系统 PATH 环境变量中; 2.运行 copy_to_ffmpeg.bat, 把 echoc.exe LED_font.ttf 文件拷贝到 D:\ffmpeg\ 目录下. echoc.exe 在CMD控制台环境下输出彩色字符; LED_font.ttf 用于输出时间戳

图片生成居中缩略图的算法

最近在研究PHP,因为项目中需要使用到缩略图,缩略图如果不裁剪的话,你会发现图像变得奇形怪状,不利于排版.因此这里就简单介绍一下生成居中缩略图的想法: 一张图片480*800 现在我要裁剪成一张240*240的图片 类似于上面的这张. 1.首先我们需要计算缩放的时候是宽度优先还是高度优先,如果是像上面这样的就是宽度优先. 则缩放比例就是 ratio = image_width_dst/image_width_src 2.根据比例,缩小后的高度就是 image_height_pre = image

java生成生成图片缩略图

/** * */ package com.fkhwl.fkhserver.core.utils; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import javax.imageio.ImageI

利用FFmpeg生成视频缩略图

1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/builds/win32/static/ 2.运行 copy_to_ffmpeg.bat, 把 echoc.exe LED_font.ttf 文件拷贝到 D:\ffmpeg\ 目录下. echoc.exe 在CMD控制台环境下输出彩色字符; LED_font.ttf 用于输出时间戳的字体文件; 3.Make_Thumbnail.bat 可带