C#缩略图_一个简单的缩略图查看器控件
2014-07-04 18:38:08  By: dwtedx

一个非常简单的文本查看器从FlowLayoutPanel中继承初学者

介绍

这种控制使您可以从桌面上添加缩略图通过的DragDrop图像和缩略图上双击预览图像。

使用代码

首先,声明一个“ImageExtensions”名单,以确保添加到控件中的所有文件都是图像类型。


///Image Extensions accepted by this control
///private ListImageExtensions = new List{ ".JPG", ".JPE", ".BMP", ".GIF", ".PNG" };
该系统的DragDrop仅仅是简单的,使用DragEnter事件,当用户拖动文件来控制和DragDrop事件来处理这些文件来设置的效果。



 void ThumbnailViewerControl_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.None;
        }

void ThumbnailViewerControl_DragDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                AddImage(files);
            }
        }
当降到文件来控制,该AddImage方法将图像添加到列表作为二进制,然后通过MakeThumbnail方法显示面板上的缩略图。



public void AddImage(string[] files)
        {
            this.Cursor = Cursors.WaitCursor;

            byte[] binary;
            for (int i = 0; i < files.Count(); i++) { 
			// Only accept Image files if (
			ImageExtensions.Contains(Path.GetExtension(files[i]).ToUpperInvariant())
			) 
			{ // Convert Image File to Binary binary = File.ReadAllBytes(files[i]); 
			// Add binary data to List ImageList.Add(binary); 
			// Create a Thumnail of Image and add Thumbnail to Panel MakeThumbnail(binary); 
			GC.GetTotalMemory(true); } } this.Cursor = Cursors.Default; } 
			public void MakeThumbnail(byte[] binary) { 
			// Create a Picture Box for showing thumbnail image 
			PictureBox thumb = new PictureBox(); 
			thumb.MaximumSize = new Size(128, 128); 
			thumb.MinimumSize = new Size(128, 128); 
			thumb.Size = new Size(128, 128); 
			thumb.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 
			thumb.SizeMode = PictureBoxSizeMode.Zoom; 
			// Create a border when Mouse entered 
			thumb.MouseEnter += new EventHandler(thumb_MouseEnter); 
			// Clear border when Mouse leaved 
			thumb.MouseLeave += new EventHandler(thumb_MouseLeave); 
			// Preview image when Mouse Double Clicked 
			thumb.DoubleClick += new EventHandler(thumb_DoubleClick); 
			// Set thumbnail image MemoryStream ms = new MemoryStream(); 
			thumb.Image = Image.FromStream(new MemoryStream(binary)) 
			.GetThumbnailImage(thumb.Width - 2, thumb.Height - 2, null, 
			new IntPtr()); ms.Close(); // Add to Panel 
			this.Controls.Add(thumb); }
现在,缩略图将被添加到面板,但是当用户移动鼠标光标,使其更漂亮,使用MouseEnter事件来绘制一个边框围绕缩略图和清晰的边界,当鼠标离开了MouseLeave事件



void thumb_MouseLeave(object sender, EventArgs e)
        {
            ((PictureBox)sender).Invalidate();
        }

void thumb_MouseEnter(object sender, EventArgs e)
        {
            var rc = ((PictureBox)sender).ClientRectangle;
            rc.Inflate(-2, -2);
            ControlPaint.DrawBorder(((PictureBox)sender).CreateGraphics()
                , ((PictureBox)sender).ClientRectangle, Color.Red, ButtonBorderStyle.Solid);
            ControlPaint.DrawBorder3D(((PictureBox)sender).CreateGraphics()
                , rc, Border3DStyle.Bump);
        }
缩略图是小的,对不对?因此,当用户想要“预览”原图,让我们向他们展示缩略图的鼠标双击事件创建一个预览的形式。



void thumb_DoubleClick(object sender, EventArgs e)
        {
            Form previewForm = new Form();
            previewForm.FormBorderStyle = FormBorderStyle.SizableToolWindow;
            previewForm.MinimizeBox = false;
            previewForm.Size = new System.Drawing.Size(800, 600);
            previewForm.StartPosition = FormStartPosition.CenterScreen;

            PictureBox view = new PictureBox();
            view.Dock = DockStyle.Fill;

            int index = this.Controls.GetChildIndex((PictureBox)sender);
            view.Image = BinaryToImage(ImageList[index]);

            view.SizeMode = PictureBoxSizeMode.Zoom;

            previewForm.Controls.Add(view);
            previewForm.ShowDialog();
        }
在上述情况下,缩略图doubleclicked时,我们必须将二进制数据转换回图像,这种方法会做这项工作。



 public static Image BinaryToImage(byte[] binaryData)
        {
            if (binaryData == null) return null;
            byte[] buffer = binaryData.ToArray();
            MemoryStream memStream = new MemoryStream();
            memStream.Write(buffer, 0, buffer.Length);
            return Image.FromStream(memStream);
        }
就这样!这仅仅是一个提示对于初学者,我建议你添加更多的方法来它像:

删除图片的方法:删除一个选择缩略图,小心面板控制指标和列表项的索引。
BackgroundWorker的:当你添加了大量的图像用户界面会冻结,所以一个BackgroundWorker会处理它。
线程:大尺寸图像将消耗时间。尝试像并行循环,使这一进程更快。
感谢您阅读并随意评论。

源码链接: http://dwtedx.com/download.html?bdkey=s/1kTl1OVX 密码: u5l4

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+