效果图如下:
前段日子编写了一个图片库的小程序,遇到了很多问题.这里罗列一下:
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