有没有被我们系统中常用的图片查看器心烦透了,明明是一个最朴实的软件,偏偏整的不是广告就是会员的,图片没看到,广告倒是看了不少。
痛定思痛之下,还是用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);
}
}
运行测试
好了,到此一个属于我们自己的图片查看器就完成了,先看一下效果图
是不是超级简洁啊,可以全屏也可以拖放到适合的大小,把图片拖进去就可以正常显示
可以显示上一张、下一张,还可以旋转一下图片
置顶显示时,可以一边看图片,一边来打开不同的文件夹,避免遮挡住。
还可以把图片保存成需要的格式,对显示的图片进行格式转换,也很实用。
好了,一个属于我们自己的图片浏览器就完成了,没有广告、没有心烦,只有安静的看图欣赏。