缩略图批量生成器

来源:互联网 发布:云计算大会2017 编辑:程序博客网 时间:2024/05/20 18:40
answer著于发表 2008-1-26
C#,.NET 2.0,.NET 3.0/3.5
轉貼地址:http://www.msproject.cn/article/ThumbnailGenerator.aspx
大家好最近因为在学习一些底层方面的东西所以,好久没来这里逛逛了,快过年了,天气也变得异常得冷,大家注意保暖. 这次给大家演示的是一个批量生成缩略图的程序,
因为今年几个老同学准备组织一次十年同学会,想到时候拍照合影肯定免不了,不过,据在下拙见,好像数码相机照出来的图像都特别的大,想要是放到网站上去打开肯定很慢,所以觉得有必要搞个工具来批量生成. 啊呀那边有砖头飞过来了,俺马上进入正题. 先看一下主界面吧.在下艺术细胞有限界面比较简陋,不过,必竟是自己用.呵呵.所以不管它了.呵呵(偷懒一下)

程序主界面

相信大家一看就明白了,偶就不多介绍了.

 这是俺自己封装的一个控件.只是为了主程序代码少一点.实现很简单,下面稍微介绍一下,此控件的 Dll  文件名是 FileBro.dll  除了这个控件外,这个 dll  文件中还有一个组件---OSDWIN 这个其实不是俺写的,是在坛子里其它兄弟翻译的一个 codeproject上牛人写的一个OSDwindow 的组件,之所以要提这个呢.因为俺做了一下包装,因为直接用原作者的代码的话调用比较麻烦,需要设字体,字体色了.而且还不是设计视图的,得用代码来写比较麻烦,所以俺包装了一下,可以支持用设计视图来设置字体,和字体色.好了,这个OSD就介绍到这,具体关于详细的内容大家可以在坛子搜一下这篇贴子.

下面截几张运行里的图:

在全部生成完毕后,会出现一个OSD显示的提示信息,具体大家运行程序的时候就会知道了.

至于缩略图的生成用的是俺自己写的一个 DLL: ANSWER.Graphic.DLL 比较简单,就一个方法,就是用来生成缩略图的 如下:

 

/// 
        
/// 生成缩略图
        
/// 
        
/// 源图路径(物理路径)
        
/// 缩略图路径(物理路径)
        
/// 缩略图宽度
        
/// 缩略图高度
        
/// 生成缩略图的方式    
        
/// 保存格式  

        public static void ImageThumbnail(   string originalImagePath, 
                                            
string thumbnailPath, 
                                            
int width, 
                                            
int height,
                                            ThumbMode mode,
                    System.Drawing.Imaging.ImageFormat saveFormat)
        
{
            Image originalImage 
= Image.FromFile(originalImagePath);

            
int towidth = width;
            
int toheight = height;            
            
int x = 0;
            
int y = 0;
            
int ow = originalImage.Width;
            
int oh = originalImage.Height;

            
switch (mode)
            
{
                
case ThumbMode.HW://指定高宽缩放(可能变形)
                    break;
                
case ThumbMode.W://指定宽,高按比例      
                    toheight = originalImage.Height * width / originalImage.Width;
                    
break;
                
case ThumbMode.H://指定高,宽按比例
                    towidth = originalImage.Width * height / originalImage.Height;
                    
break;
                
case ThumbMode.Cut://指定高宽裁减(不变形) 
                    if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                    
{
                        oh 
= originalImage.Height;
                        ow 
= originalImage.Height * towidth / toheight;
                        y 
= 0;
                        x 
= (originalImage.Width - ow) / 2;
                    }

                    
else
                    
{
                        ow 
= originalImage.Width;
                        oh 
= originalImage.Width * height / towidth;
                        x 
= 0;
                        y 
= (originalImage.Height - oh) / 2;
                    }

                    
break;
                
default:
                    
break;
            }

            
//新建一个bmp图片
            Image bitmap = new System.Drawing.Bitmap(towidth, toheight);

            
//新建一个画板
            Graphics g = System.Drawing.Graphics.FromImage(bitmap);

            
//设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

            
//设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            
//清空画布并以透明背景色填充
            g.Clear(Color.Transparent);

            
//在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(originalImage, new Rectangle(00, towidth, toheight),
                
new Rectangle(x, y, ow, oh),
                GraphicsUnit.Pixel);

            
try
            
{
                
//以jpg格式保存缩略图
                bitmap.Save(thumbnailPath, saveFormat);
            }

            
catch (System.Exception e)
            
{
                
throw e;
            }

            
finally
            
{
                originalImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }

        }

由于我们是要批量生成,但是我在我的主程序中的 foreach 中调用这这个方法VS会报内存不足异常,目前俺还不知道如何解决,希望有知道原因的朋友们知道后跟贴告知一下,由于这个原因,所以我在主程序中用一个 try catch 过滤掉

下面介绍一下主程序的一些代码

 

private const int WM_VSCROLL = 0x115;private const int SB_BOTTOM = 7;[DllImport("user32.dll", EntryPoint = "SendMessageA")]private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

 这个API 是用来控制我们主界面上的 listbox 当有新项添加进来时,滚动条能始终在最下面.

 public delegate void dlg_UpdatePgb(int curvalu);

public delegate void dlg_UpdateList(string addvlu);

public delegate void dlg_UI(string txt,uint ant,int durt);

public delegate void dlg_EndMSG();

public delegate void dlg_generate_thumbnail(List flst, string dstroot);

这是定义的几个委托类型,主要是为了异步回调做服务的,如果有朋友对异步回调不是太清楚的话,可以在坛子里面搜一下我的另一篇文章,有比较具体的讲述了异步回调

其实这个程序的实现还是很简单的,之所以要发出来主要有以下几个原因,
1.我的生成缩略图循环调用中会报内存不足的原因没有找到,希望有高人能赐教
2.OSDwin 的坛子中有了,不过使用起来比较麻烦,我包装了一下,调用比较直观,给有需要的朋友可以更易使用

好了,就说这么多吧. 在下水平有限.代码写得比较没有水准,献丑了.切勿见笑.呵呵

原创粉丝点击