C#缩略图_一个简单的缩略图查看器控件
程序员文章站
2022-03-01 17:44:50
...
一个非常简单的文本查看器从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
下一篇: Android中“分享”功能的实现
推荐阅读