北大青鸟南京普雷

北大青鸟南京普雷

转载 缩略图批量生成器收藏

新一篇: 搞笑办zheng | 旧一篇: C# 热键注册 实例讲解

这是一个缩略图处理程序,可以一次把目录中的图片都生成对应的小图,有点像Acdsee中的图像大小缩放工具...

  大家好最近因为在学习一些底层方面的东西所以,好久没来这里逛逛了,快过年了,天气也变得异常得冷,大家注意保暖. 这次给大家演示的是一个批量生成缩略图的程序,
因为今年几个老同学准备组织一次十年同学会,想到时候拍照合影肯定免不了,不过,据在下拙见,好像数码相机照出来的图像都特别的大,想要是放到网站上去打开肯定很慢,所以觉得有必要搞个工具来批量生成. 啊呀那边有砖头飞过来了,俺马上进入正题. 先看一下主界面吧.在下艺术细胞有限界面比较简陋,不过,必竟是自己用.呵呵.所以不管它了.呵呵(偷懒一下)

程序主界面

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

 这是俺自己封装的一个控件.只是为了主程序代码少一点.实现很简单,下面稍微介绍一下,此控件的 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(0, 0, 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 的坛子中有了,不过使用起来比较麻烦,我包装了一下,调用比较直观,给有需要的朋友可以更易使用

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

 

发表于 @ 2008年03月13日 15:06:00|评论(loading...)|编辑

新一篇: 搞笑办zheng | 旧一篇: C# 热键注册 实例讲解

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © LI'JIE