序
做这个工具的初衷是,工作中遇到了Base64转图片的情况,便在工作之余做了这么一个小工具
方便自己使用的小工具嘛,便没有做什么UI布局,简洁明了便好
小样
核心代码
图片转Base64
/// <summary>
/// 图片转Base64
/// </summary>
/// <param name="fileFullName"></param>
/// <returns></returns>
public static string ImageToBase64(string fileFullName)
{
try
{
Bitmap bmp = new(fileFullName);
MemoryStream ms = new();
string suffix = fileFullName.Substring(fileFullName.LastIndexOf('.') + 1,
fileFullName.Length - fileFullName.LastIndexOf('.') - 1).ToLowerInvariant();
ImageFormat suffixName = suffix == "png"
? ImageFormat.Png : suffix is "jpg" or "jpeg"
? ImageFormat.Jpeg : suffix == "bmp"
? ImageFormat.Bmp : suffix == "gif"
? ImageFormat.Gif : ImageFormat.Jpeg;
bmp.Save(ms, suffixName);
byte[] arr = new byte[ms.Length]; ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length); ms.Close();
return Convert.ToBase64String(arr);
}
catch (Exception ex)
{
return ex.Message;
}
}
Base64转图片
/// <summary>
/// Base64转图片
/// </summary>
/// <param name="strBase64"></param>
/// <returns></returns>
public static BitmapImage Base64ToImage(string strBase64)
{
string imagebase64 = strBase64[(strBase64.IndexOf(",", StringComparison.OrdinalIgnoreCase) + 1)..];
byte[] streamBase = Convert.FromBase64String(imagebase64);
BitmapImage image = new();
image.BeginInit();
image.StreamSource = new MemoryStream(streamBase);
image.EndInit();
return image;
}
小工具中使用到的小技巧
文件拖放
使用 一个属性 两个事件
为当前窗体添加下面的属性和事件
AllowDrop="True" Drop="Window_Drop" DragEnter="Window_DragEnter"
主要说说两个事件
Drop 事件
Drop 事件 主要用来确定显示文件的方式,这里使用 路径链接 的方式
private void Window_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effects = DragDropEffects.Link;
else e.Effects = DragDropEffects.None;
}
DragEnter 事件
对拖放到当前区域的文件做相应的处理
private void Window_DragEnter(object sender, DragEventArgs e)
{
foreach (object o in e.Data.GetData(DataFormats.FileDrop) as Array)
{
LblTips.Content = null;
ImgFilePath = o.ToString();
ImgImages.Source = new BitmapImage(new Uri(o.ToString(), UriKind.RelativeOrAbsolute));
}
}
文件保存
这里写的很简单,利用前面已经转换好的文件进行保存,需要注意的是,打开选择路径对话框,建议直接调用系统 API 的方式
/// <summary>
/// 保存图片
/// </summary>
/// <param name="saveImgPath"></param>
public void SaveImage()
{
SaveFileDialog dlg = new()
{
Title = "图片另存为",
FileName = Guid.NewGuid().ToString(),
DefaultExt = ".png",
Filter = $"图像文件(*.png, *.bmp, *.jpg)|*.png;*.bmp;*.jpg|所有文件(*.*)|*.*"
};
if (dlg.ShowDialog() is false || !dlg.FileName.Contains("\\")) return;
string saveImgPath = dlg.FileName;
BitmapSource BS = ImgImages.Source as BitmapSource;
PngBitmapEncoder PBE = new();
PBE.Frames.Add(BitmapFrame.Create(BS));
using Stream stream = File.Create(saveImgPath);
PBE.Save(stream);
}
以上便是,重点部分拆析,下面给出了全部的代码,没什么新奇的,都是很常规的代码
全部逻辑代码
using Microsoft.Win32;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows;
using System.Windows.Media.Imaging;
namespace ImagesBase64TurnTools
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
/// <summary>
/// 图片路径
/// </summary>
public string ImgFilePath { get; set; }
private void Window_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effects = DragDropEffects.Link;
else e.Effects = DragDropEffects.None;
}
private void Window_DragEnter(object sender, DragEventArgs e)
{
foreach (object o in e.Data.GetData(DataFormats.FileDrop) as Array)
{
LblTips.Content = null;
ImgFilePath = o.ToString();
ImgImages.Source = new BitmapImage(new Uri(o.ToString(), UriKind.RelativeOrAbsolute));
}
}
private void BtnImage_Click(object sender, RoutedEventArgs e)
{
try
{
if (!string.IsNullOrWhiteSpace(TxtBase64.Text))
ImgImages.Source = Base64ToImage(TxtBase64.Text.Trim());
LblTips.Content = null;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示信息", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
private void BtnBase64_Click(object sender, RoutedEventArgs e)
{
try
{
if (ImgFilePath is not null)
{
Dispatcher.BeginInvoke(new Action(() =>
{
TxtBase64.Text = ImageToBase64(ImgFilePath);
}));
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示信息", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
/// <summary>
/// 保存转换后的图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnSave_Click(object sender, RoutedEventArgs e)
{
if (ImgImages.Source is not null)
SaveImage();
}
private void BtnClear_Click(object sender, RoutedEventArgs e)
{
ImgImages.Source = null;
TxtBase64.Clear();
LblTips.Content = "拖放图片文件至此";
}
/// <summary>
/// 图片转Base64
/// </summary>
/// <param name="fileFullName"></param>
/// <returns></returns>
public static string ImageToBase64(string fileFullName)
{
try
{
Bitmap bmp = new(fileFullName);
MemoryStream ms = new();
string suffix = fileFullName.Substring(fileFullName.LastIndexOf('.') + 1,
fileFullName.Length - fileFullName.LastIndexOf('.') - 1).ToLowerInvariant();
ImageFormat suffixName = suffix == "png"
? ImageFormat.Png : suffix is "jpg" or "jpeg"
? ImageFormat.Jpeg : suffix == "bmp"
? ImageFormat.Bmp : suffix == "gif"
? ImageFormat.Gif : ImageFormat.Jpeg;
bmp.Save(ms, suffixName);
byte[] arr = new byte[ms.Length]; ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length); ms.Close();
return Convert.ToBase64String(arr);
}
catch (Exception ex)
{
return ex.Message;
}
}
/// <summary>
/// Base64转图片
/// </summary>
/// <param name="strBase64"></param>
/// <returns></returns>
public static BitmapImage Base64ToImage(string strBase64)
{
string imagebase64 = strBase64[(strBase64.IndexOf(",", StringComparison.OrdinalIgnoreCase) + 1)..];
byte[] streamBase = Convert.FromBase64String(imagebase64);
BitmapImage image = new();
image.BeginInit();
image.StreamSource = new MemoryStream(streamBase);
image.EndInit();
return image;
}
/// <summary>
/// 保存图片
/// </summary>
/// <param name="saveImgPath"></param>
public void SaveImage()
{
SaveFileDialog dlg = new()
{
Title = "图片另存为",
FileName = Guid.NewGuid().ToString(),
DefaultExt = ".png",
Filter = $"图像文件(*.png, *.bmp, *.jpg)|*.png;*.bmp;*.jpg|所有文件(*.*)|*.*"
};
if (dlg.ShowDialog() is false || !dlg.FileName.Contains("\\")) return;
string saveImgPath = dlg.FileName;
BitmapSource BS = ImgImages.Source as BitmapSource;
PngBitmapEncoder PBE = new();
PBE.Frames.Add(BitmapFrame.Create(BS));
using Stream stream = File.Create(saveImgPath);
PBE.Save(stream);
}
}
}