醋醋百科网

Good Luck To You!

开发一个清静的图片查看器,告别那些广告和会员

有没有被我们系统中常用的图片查看器心烦透了,明明是一个最朴实的软件,偏偏整的不是广告就是会员的,图片没看到,广告倒是看了不少

痛定思痛之下,还是用C#开发一个属于自己的图片查看器吧,不需要广告,没有会员,可以打开webp格式的图片,可置顶显示,可对图片进行另存就行了,功能简洁够用。

界面设计

为了按钮美观,可以使用 antdui第三方控件库,使用SixLabors.ImageSharp库来加载图片,然后从阿里云图标库下载几个向左、向右、旋转的图标就可以了,大体上如下:

底部的panel用来放置常用的按钮,设置个背景色,按钮不要写文字,直接放个图片就行了,然后增加个右键菜单,用来置顶显示和另存为,最后再加个picturebox用来显示图片

功能开发

当打开一个图片时,会获取图片所在文件夹中的所有图片,并定位图片所处的位置,先定义个全局变量。

private string[] imageFiles; // 当前文件夹中的所有图片文件
private int currentIndex = -1; // 当前显示的图片索引

根据图片的名称,来加载图片并显示

private void LoadImage(PictureBox pictureBox, string filePath)
{
	try
	{
		// 使用ImageSharp加载图片
		using (Image image = Image.Load(filePath))
		{
			// 将ImageSharp图像转换为System.Drawing.Image

			using (MemoryStream memoryStream = new MemoryStream())
			{
				IImageEncoder encoder = GetEncoder(filePath);
				image.Save(memoryStream, encoder);
				pictureBox.Image = System.Drawing.Image.FromStream(memoryStream);
			}
		}
		this.Text = #34;清静图片查看器 - {filePath}";
	}
	catch (Exception ex)
	{
		MessageBox.Show(#34;无法加载图片: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
	}
}
private IImageEncoder GetEncoder(string filePath)
{
	string extension = Path.GetExtension(filePath).ToLower();
	switch (extension)
	{
		case ".jpg":
		case ".jpeg":
			return new JpegEncoder();
		case ".png":
			return new PngEncoder();
		case ".bmp":
			return new BmpEncoder();
		case ".gif":
			return new GifEncoder();
		case ".webp":
			return new WebpEncoder();
		default:
			throw new NotSupportedException(#34;不支持的图片格式: {extension}");
	}
}
private bool IsImageFile(string filePath)
{
	string extension = Path.GetExtension(filePath).ToLower();
	return extension == ".jpg" || extension == ".jpeg" ||
		   extension == ".png" || extension == ".bmp" ||
		   extension == ".gif" || extension == ".webp";
}

等一个图片拖放到窗体上时,打开图片,需要用到DragEnter和DragDrop事件

DragEnter事件

// 检查拖放的文件是否是图片文件
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
	string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
	if (files.Length > 0 && IsImageFile(files[0]))
	{
		e.Effect = DragDropEffects.Copy; // 允许拖放
	}
}

DragDrop事件

alert1.Visible = false;
// 获取拖放的文件路径
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
if (files.Length > 0 && IsImageFile(files[0]))
{
	// 获取当前文件夹中的所有图片文件
	string folderPath = Path.GetDirectoryName(files[0]);
	imageFiles = Directory.GetFiles(folderPath)
		.Where(file => IsImageFile(file))
		.ToArray();

	// 查找当前图片的索引
	currentIndex = Array.IndexOf(imageFiles, files[0]);

	// 加载图片
	LoadImage(P1, files[0]);
}

窗体置顶显示功能

if (Tbtn_top.Checked)
{
	this.TopMost = false;
	Tbtn_top.Checked = false;
}
else
{
	this.TopMost = true;
	Tbtn_top.Checked = true;
}

上一张、下一张图片显示功能

if (imageFiles == null || imageFiles.Length == 0)
	return;

// 计算上一个图片的索引
currentIndex = (currentIndex - 1 + imageFiles.Length) % imageFiles.Length;
LoadImage(P1, imageFiles[currentIndex]);
if (imageFiles == null || imageFiles.Length == 0)
	return;

// 计算下一个图片的索引
currentIndex = (currentIndex + 1) % imageFiles.Length;
LoadImage(P1, imageFiles[currentIndex]);

向左旋转90度和向右旋转90度功能,其实就是旋转好保存再重新加载

//向左旋转90度
if (imageFiles == null || imageFiles.Length == 0)
	return;
P1.Image.RotateFlip(RotateFlipType.Rotate270FlipNone);
P1.Image.Save(imageFiles[currentIndex]);
LoadImage(P1, imageFiles[currentIndex]);
if (imageFiles == null || imageFiles.Length == 0)
	return;
P1.Image.RotateFlip(RotateFlipType.Rotate90FlipNone);
P1.Image.Save(imageFiles[currentIndex]);
LoadImage(P1, imageFiles[currentIndex]);

图片另存为功能,可以把其他格式的图片另存为正常格式,也可以把windows自带的图片查看器无法打开的图片另存成可以打开的,这种图片主要是来自于微信发过来的图片。

//图片另存为
if (imageFiles == null || imageFiles.Length == 0)
	return;
string imgPath = "";
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "PNG 图片|*.png|JPEG 图片|*.jpg|BMP 图片|*.bmp|GIF 图片|*.gif";

var dr = sfd.ShowDialog();
sfd.Title = "另存为";
if (dr == DialogResult.OK)
{
	imgPath = sfd.FileName;
	string ext = Path.GetExtension(imgPath).ToLower(); ;
	using (Image image = Image.Load(imageFiles[currentIndex]))
	{
		IImageEncoder encoder = GetEncoder(ext);
		image.Save(imgPath, encoder);
	}
}

运行测试

好了,到此一个属于我们自己的图片查看器就完成了,先看一下效果图

是不是超级简洁啊,可以全屏也可以拖放到适合的大小,把图片拖进去就可以正常显示

可以显示上一张、下一张,还可以旋转一下图片

置顶显示时,可以一边看图片,一边来打开不同的文件夹,避免遮挡住。

还可以把图片保存成需要的格式,对显示的图片进行格式转换,也很实用。

好了,一个属于我们自己的图片浏览器就完成了,没有广告、没有心烦,只有安静的看图欣赏。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言