文章目录

  • 介绍
  • 具体实现
  • 总结

介绍

最近有项目遇到图片以二进制的形式存储到数据库中,但是需要以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">

总结

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

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

  1. JAVA实现图片加水印及Base64图片字符串加水印

    JAVA实现图片加水印及Base64图片字符串加水印 可将根据不同需求选择场景一,场景二来实现家水印操作,个人感觉比我上一遍文章<base64字符串加水印 >实在 场景一: 涉及上送过来的 ...

  2. Java通过JfreeChart生成转Base64图片字符串(饼图、折线图、柱状图、折线图-多条、3D柱状图、气泡图、时序图、曲线图、区域图、分布图、联合分类图、双X轴图、K线图、柱状图-横向等图)

    工具类 CreatLineChart.java package DrawLine;import java.awt.BasicStroke; import java.awt.Color; import ...

  3. 通过http方式传递base64图片字符串无法还原成图片的问题

    在使用http协议传递base64图片字符串的过程中,一些特殊字符会在传输过程中发生改变或者被添加了换行. 所以需要转义这些特殊字符以便传值. String str = base64String.re ...

  4. 怎么压缩jpg图片文件大小?jpg图片格式的压缩方法

    经常写公众号文章的小伙伴,应该遇到过插入jpg图片时失败的情况,这是因为图片超出了平台的上传限制,需要先把过大的图片压缩变小,该怎么压缩jpg图片大小呢?小编来给大家介绍一个jpg格式压缩的方法,使用 ...

  5. photoshop(PS)中图片无所压缩方法

    有时候图片长宽尺寸太大,需要压缩到指定尺寸,比如插入到word中,如我前一篇文章提到的word图片导成pdf分辨率的问题https://blog.csdn.net/pang9998/article/d ...

  6. JAVA - base64图片加文字水印

    场景为:前端传入转码后的base64图片字符串,后台加水印并转为图片,再上传 使用postman调试接口时,总会出现400bad request的情况 若是把图片转码的base64编码放在header ...

  7. 前端将base64图片转换成file文件

    1.base64转成file具体代码 // base64图片转file的方法(base64图片, 设置生成file的文件名)function base64ToFile(base64, fileName ...

  8. 压缩图片并转换为BASE64编码字符串

    调用全国人口信息社会应用平台的人像比对服务,请求参数之一"公民人像BASE64编码字符串",限制大小为30KB: 使用谷歌处理图片的开源工具(thumbnailator),可以对图 ...

  9. js压缩base64图片的方法

    话不多说,直接上代码. function compressImage(base64, callback) {var targSize = 1024 * 1024 //1024KB if (base64 ...

最新文章

  1. Handler消息处理机制详解
  2. IDC:2018年中国制造业十大预测
  3. Centos6.5搭建java开发环境
  4. Java中获取域名、端口号、项目名等实现路径适配
  5. python变量与常量内容:
  6. 看动画学算法之:排序-冒泡排序
  7. 关于多库操作一些想法
  8. 《学做程序经理》完整版
  9. mysql 组合索引 or_mysql索引优化实例(单列索引与组合索引)
  10. nodjs npm 报错:Segmentation fault: 11
  11. 贪心思维 专题记录 2017-7-21
  12. Controller接口控制器(6)
  13. 计算机考研英语书,我的计算机考研复习经验 (分5大部分,很详细)
  14. 修复python命令行下接收不到参数的问题
  15. Cannot read property 'scrollWidth' of null
  16. Winform 开发用户控件
  17. SQL Server 卸载重装
  18. 文件预览-使用SecretID和SecretKey进行腾讯云cos桶文件预览(word、ppt等)
  19. POI的word表格居中
  20. Linux驱动(并发):02---编译乱序、执行乱序(屏障API(bm、rmb、wmb、__iormb、__iowmb))

热门文章

  1. 耶鲁 计算机科学,耶鲁大学计算机科学专业排名第20(2020年USNEWS美国排名)
  2. linux select 服务器,Linux下用select()实现异步的Echo服务器
  3. php区链接,PHP读取某站点的链接的函数的方法
  4. 过年,设计师都爱的烫金红色PSD装饰素材
  5. 超强干货素材!制作平面设计专辑模板
  6. C4D模型库!你想要的模型这里都有
  7. datetimepicker 默认时间_Django项目中如何使用日期时间选择器DateTimePicker
  8. jmap 定时生成linux,linux – 创建heapdumps的替代方案,性能比jmap更高?
  9. Linux内存管理之内存寻址:分段机制的实现方式
  10. SeismicUnix:wtlib.c[小波变换库]