使用c#生成高品质小空间的缩略图

dot自带的生成缩略图的方法是Bitmap. GetThumbnailImage这个方法生成的缩略图不够清晰,一般我们会使用Graphics高质量插值发生成清晰的缩略图,这时候大小会不尽人意,怎么办?我们可以使用jpeg压缩的方法压缩一下图片,这样图片的大小会缩小到压缩前的十分之一。
下面是完成这项工作的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.IO;

namespace ConsoleApplication3_ThumbnailImg
{
    
class Program
    
{
        
const int HEIGHT = 190;
        
const int WIDTH = 190;
        
static void Main(string[] args)
        
{
            
string srcImgPath = @"G:/photoes/20060725/Picture 057.jpg";
            
string targetFolder = @"E:/Diary/Test/thumbnail";

            SetThumbnail_1(srcImgPath, targetFolder);
            SetThumbnail_2(srcImgPath, targetFolder);
            SetThumbnail_3(srcImgPath, targetFolder);

            Console.Read();
        }


        
static void SetThumbnail_1(string srcImgPath, string targetFolder)
        
{
            
using (Bitmap source = new Bitmap(srcImgPath))
            
{
                
// return the source image if it's smaller than the designated thumbnail   
                int wi, hi;
                wi 
= WIDTH;
                hi 
= HEIGHT;


                
// maintain the aspect ratio despite the thumbnail size parameters   
                if (source.Width > source.Height)
                
{
                    wi 
= WIDTH;
                    hi 
= (int)(source.Height * ((decimal)WIDTH / source.Width));
                }

                
else
                
{
                    hi 
= HEIGHT;
                    wi 
= (int)(source.Width * ((decimal)HEIGHT / source.Height));
                }


                
using (Image thumb = source.GetThumbnailImage(wi, hi, null, IntPtr.Zero))
                
{
                    
string targetPath = Path.Combine(targetFolder, "th_1.jpg");
                    thumb.Save(targetPath);
                }

            }

        }


        
static void SetThumbnail_2(string srcImgPath, string targetFolder)
        
{
            
using (Bitmap source = new Bitmap(srcImgPath))
            
{
                
// return the source image if it's smaller than the designated thumbnail   
                int wi, hi;
                wi 
= WIDTH;
                hi 
= HEIGHT;


                
// maintain the aspect ratio despite the thumbnail size parameters   
                if (source.Width > source.Height)
                
{
                    wi 
= WIDTH;
                    hi 
= (int)(source.Height * ((decimal)WIDTH / source.Width));
                }

                
else
                
{
                    hi 
= HEIGHT;
                    wi 
= (int)(source.Width * ((decimal)HEIGHT / source.Height));
                }


                
// original code that creates lousy thumbnails   
                
// System.Drawing.Image ret = source.GetThumbnailImage(wi,hi,null,IntPtr.Zero);   
                using (System.Drawing.Bitmap thumb = new Bitmap(wi, hi))
                
{
                    
using (Graphics g = Graphics.FromImage(thumb))
                    
{
                        g.InterpolationMode 
= System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                        g.FillRectangle(Brushes.White, 
00, wi, hi);
                        g.DrawImage(source, 
00, wi, hi);
                    }

                    
string targetPath = Path.Combine(targetFolder, "th_2.jpg");
                    thumb.Save(targetPath);
                }


            }

        }


        
static void SetThumbnail_3(string srcImgPath, string targetFolder)
        
{
            
//Configure JPEG Compression Engine   
            System.Drawing.Imaging.EncoderParameters encoderParams = new System.Drawing.Imaging.EncoderParameters();
            
long[] quality = new long[1];
            quality[
0= 75;
            System.Drawing.Imaging.EncoderParameter encoderParam 
= new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
            encoderParams.Param[
0= encoderParam;

            System.Drawing.Imaging.ImageCodecInfo[] arrayICI 
= System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
            System.Drawing.Imaging.ImageCodecInfo jpegICI 
= null;
            
for (int x = 0; x < arrayICI.Length; x++)
            
{
                
if (arrayICI[x].FormatDescription.Equals("JPEG"))
                
{
                    jpegICI 
= arrayICI[x];
                    
break;
                }

            }


            
using (Bitmap source = new Bitmap(srcImgPath))
            
{
                
int wi, hi;
                wi 
= WIDTH;
                hi 
= HEIGHT;


                
// maintain the aspect ratio despite the thumbnail size parameters   
                if (source.Width > source.Height)
                
{
                    wi 
= WIDTH;
                    hi 
= (int)(source.Height * ((decimal)WIDTH / source.Width));
                }

                
else
                
{
                    hi 
= HEIGHT;
                    wi 
= (int)(source.Width * ((decimal)HEIGHT / source.Height));
                }


                
// original code that creates lousy thumbnails   
                
// System.Drawing.Image ret = source.GetThumbnailImage(wi,hi,null,IntPtr.Zero);   
                using (System.Drawing.Bitmap thumb = new Bitmap(wi, hi))
                
{
                    
using (Graphics g = Graphics.FromImage(thumb))
                    
{
                        g.InterpolationMode 
= System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                        g.FillRectangle(Brushes.White, 
00, wi, hi);
                        g.DrawImage(source, 
00, wi, hi);
                    }

                    
string targetPath = Path.Combine(targetFolder, "th_3.jpg");
                    thumb.Save(targetPath, jpegICI, encoderParams);
                }


            }


        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值