分享一个小工具 图片与Base64编码 互转 工具

做这个工具的初衷是,工作中遇到了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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑夜中的潜行者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值