使用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); 
	} 
}
  1. 如何截取图片缩略图

    在网上查到两种资料,
    一种是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()可以较为真实的反映原图的效果

  2. 如何缩放图片

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

    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