介绍
最近有项目遇到图片以二进制的形式存储到数据库中,但是需要以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">
总结
本文只是为了记录工作中用到的一些技术点,分享出来,希望对大家有所帮助。