使用C#编写的轻量级图片库

2013年12月11日 23:50

效果图如下:

效果图
效果图

前段日子编写了一个图片库的小程序,遇到了很多问题.这里罗列一下:

1. 如何实现拖动无标题栏窗口

即当form的FormBorderStyle=None时,窗口如何响应鼠标拖动事件.
实现代码如下:

private const int WM_SYSCOMMAND = 0x0112; private const int SC_MOVE = 0xF010;/*移动信息*/ /*表示鼠标在窗口标题栏时的系统信息*/ private const int HTCAPTION = 0x0002; [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); [DllImport("user32.dll")] public static extern bool ReleaseCapture(); /*响应鼠标单击事件*/ private void Form1_MouseDown(object sender, MouseEventArgs e) { /*鼠标相对于窗体的坐标*/ if (e.Location.Y <= 36) { ReleaseCapture(); SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); } }

2. 如何截取图片缩略图

在网上查到两种资料,
一种是Image newPic = pictrue.GetThumbnailImage(Width, Height, null, IntPtr.Zero);
另一种是Image newPic = new System.Drawing.Bitmap(pictrue, Width, Height)
其中pictrue为原图片,Width和Height为裁剪后图片的宽高
经过实际操作发现当原图为高清图的时候,使用pictrue.GetThumbnailImage()截取的缩略图会严重失真,而使用System.Drawing.Bitmap()可以较为真实的反映原图的效果

3. 如何缩放图片

使用何种尺寸去裁剪才能尽量的反映原图的效果.我的目标是不改变原图的宽高比例,在外框的限制下成比例缩小,若原图的宽高都小于外框则不进行裁剪.

具体代码如下:

private Image dealPic(String picPath) { Image pictrue = Image.FromFile(picPath); int tmpW = PIC_WIDTH, tmpH = PIC_HEIGHT; /*PIC_WIDTH为外框的限制宽度,PIC_HEIGHT为外框的限制高度,为全局变量*/ double rate;//缩放比例 int width = pictrue.Size.Width; int height = pictrue.Size.Height; size = pictrue.Size; /*图像裁剪处理*/ if (width > PIC_WIDTH || height > PIC_HEIGHT) { if ((double)(width * 1.0 / height) < 1.5)//过高 { rate = height * 1.0 / tmpH; tmpW = (int)(width * 1.0 / rate); } else//过宽 { rate = width * 1.0 / tmpW; tmpH = (int)(height * 1.0 / rate); } } else return pictrue; Image newPic = pictrue.GetThumbnailImage(tmpW, tmpH, null, IntPtr.Zero);//绘制底质量图 /*释放图片内存*/ pictrue.Dispose(); return newPic; }

具体可以参考本人源代码.
新手写C#,代码不是很好,如有什么意见请留言.
个人认为本程序中最大的一个问题是载入大量图片的时候比较卡顿,可以考虑多线程解决.Ps:本人多线程没学好
还有图片还不支持鼠标滚动条缩放大小,这个我还没有头绪…
知道的朋友可以提醒一下,谢谢
源代码及程序,下载链接 http://sdrv.ms/IPchCt

文章作者: qbeenslee

CC BY-NC 4.0