使用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. 如何缩放图片

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

```cs
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