因为今年几个老同学准备组织一次十年同学会,想到时候拍照合影肯定免不了,不过,据在下拙见,好像数码相机照出来的图像都特别的大,想要是放到网站上去打开肯定很慢,所以觉得有必要搞个工具来批量生成. 啊呀那边有砖头飞过来了,俺马上进入正题. 先看一下主界面吧.在下艺术细胞有限界面比较简陋,不过,必竟是自己用.呵呵.所以不管它了.呵呵(偷懒一下)
相信大家一看就明白了,偶就不多介绍了.
这是俺自己封装的一个控件.只是为了主程序代码少一点.实现很简单,下面稍微介绍一下,此控件的 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 的坛子中有了,不过使用起来比较麻烦,我包装了一下,调用比较直观,给有需要的朋友可以更易使用
好了,就说这么多吧. 在下水平有限.代码写得比较没有水准,献丑了.切勿见笑.呵呵