欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

C#缩略图_一个简单的缩略图查看器控件

程序员文章站 2022-03-01 17:44:50
...

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

C#缩略图_一个简单的缩略图查看器控件

介绍

这种控制使您可以从桌面上添加缩略图通过的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