C#关于base64图片字符串的压缩方法

介绍

最近有项目遇到图片以二进制的形式存储到数据库中,但是需要以base64字符串的形式通过接口传到前端进行展示,但是有个图片流很大,会造成接口很慢或者直接超时报错。由于历史原因及变更方案代价比较大,所以我想是不是可以对base64字符串就行压缩后在传输到前端展示。于是就有了这篇文章。

具体实现

网上看了相关资料,没有对base64的直接压缩介绍。但是有图片转base64字符串,base64字符串转图片等方法的介绍,同时也有对图片进行缩放在现实的介绍。所以,我结合这两种方式封装了一个方法,以实现对base64字符串进行展示的效果。

废话不多说,直接上代码就好。

/// <summary>
/// 生成缩略图
/// </summary>
/// <param name="srcImageStream">原始图片的字节数组</param>
/// <param name="width">最终的图片宽度</param>
/// <param name="height">最终的图片高度</param>
/// <returns>压缩后的base64字符串</returns>
public static string CutImage(byte[] srcImageStream, int width, int height)
{
    MemoryStream msSource = new MemoryStream(srcImageStream);
    Bitmap btImage = new Bitmap(msSource);
    msSource.Close();
    Image serverImage = btImage;
    //画板大小
    int finalWidth = width, finalHeight = height;
    int srcImageWidth = serverImage.Width;
    int srcImageHeight = serverImage.Height;
    if (srcImageWidth > srcImageHeight)
    {
        finalHeight = srcImageHeight * width / srcImageWidth;
    }
    else
    {
        finalWidth = srcImageWidth * height / srcImageHeight;
    }
    //新建一个bmp图片
    Image newImage = new Bitmap(width, height);
    //新建一个画板
    Graphics g = Graphics.FromImage(newImage);
    //设置高质量插值法
    g.InterpolationMode = InterpolationMode.High;
    //设置高质量,低速度呈现平滑程度
    g.SmoothingMode = SmoothingMode.HighQuality;
    //清空画布并以透明背景色填充
    g.Clear(Color.White);
    //在指定位置并且按指定大小绘制原图片的指定部分
    g.DrawImage(serverImage, new Rectangle((width - finalWidth) / 2, (height - finalHeight) / 2, finalWidth, finalHeight), 0, 0, srcImageWidth, srcImageHeight, GraphicsUnit.Pixel);
    //以jpg格式保存缩略图
    MemoryStream msSaveImage = new MemoryStream();
    newImage.Save(msSaveImage, ImageFormat.Jpeg);
    serverImage.Dispose();
    newImage.Dispose();
    g.Dispose();
    byte[] imageBytes = msSaveImage.ToArray();
    msSaveImage.Close();
    return Convert.ToBase64String(imageBytes);
}

通过上面的方法,可以把几百K的图片压缩到几K大小,从而直接在前端展示。前端展示格式为:

data:image/png;base64,[base64字符串]

[base64字符串] 表示具体的base64内容字符串

在html的img标签中的显示方式如下:

<img src="data:image/png;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBg3ODk6Q0RFRkdISUpTVFVWV190rxlp9x59vNAjMxK5VsbSOh47+tFdJ4XuxeX1uT1ByOehxRV05cyuRJWZgePrJ7rxyk0iE2tvbxkrj/WuS2F+nc+31rC1W6ndRCZCwPzEKOM/wBaKKibvIuK0OXurci4ded2Afxqt5UuceU35UUVvF6GT3GS2z7Nz/kK7rw3cGfRlO0nnaRg0UVhX+G5dPc6Dwdvg8RwxYcKxbhh06//AFqKKKMP8LHU3P/Z">

总结

本文只是为了记录工作中用到的一些技术点,分享出来,希望对大家有所帮助。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值