Golang压缩Jpeg图片和PNG图片

摘要:
Jpeg的图片压缩是很好做的,因为jpeg这个协议本身就支持调整图片质量的。在golang中,我们只需要使用标准库的image/jpeg,将图片从二进制数据解码后,降低质量再编码为二进制数据即可实现压缩。=nil{returndata}ifbuf.Len()˃len{returndata}returnbuf.Bytes()}比较麻烦的是压缩PNG图片,在网上找了很多相关的库,感觉都没什么即可以保持质量,又可以尽可能压缩的办法。=nil{returndata}ifbuf.Len()˃len{returndata}returnbuf.Bytes()}最后给大家分享一个超级好用PDF处理的golang库:https://github.com/unidoc/unipdf。
  • 博主一直在维护一个导出PDF的服务,但是这个服务导出的PDF文件是真的巨大,动辄就上百MB。这里面主要是图片占据了大多数体积,所以考虑在导出前压缩一下图片。
  • Jpeg的图片压缩是很好做的,因为jpeg这个协议本身就支持调整图片质量的。在golang中,我们只需要使用标准库的image/jpeg,将图片从二进制数据解码后,降低质量再编码为二进制数据即可实现压缩。而且质量和压缩比例相对而言还不错。
func compressImageResource(data []byte) []byte {
	img, _, err := image.Decode(bytes.NewReader(data))
	if err != nil {
		return data
	}
	buf := bytes.Buffer{}
	err = jpeg.Encode(&buf, img, &jpeg.Options{Quality: 40})
	if err != nil {
		return data
	}
	if buf.Len() > len(data) {
		return data
	}
	return buf.Bytes()
}
  • 比较麻烦的是压缩PNG图片,在网上找了很多相关的库,感觉都没什么即可以保持质量,又可以尽可能压缩的办法。
//下面这两个库都比较偏重于转换图片大小,在保持宽高不变的情况下,压缩比例很一般
https://github.com/discord/lilliput                        //这个库是一家海外公司基于C语言的一个开源图片处理库,但是封装的很好,不需要安装额外依赖
https://github.com/disintegration/imaging

//下面这个库可以对PNG图片进行较大的压缩,可惜压缩比例过大时会严重失真
https://github.com/foobaz/lossypng/

  • 后来,借鉴一篇博客的做法,还是先把PNG图片转换为Jpeg图片,然后再将jpeg图片的质量降低。相对上边这些库,压缩比例和质量都比较令人满意
func compressImageResource(data []byte) []byte {
	imgSrc, _, err := image.Decode(bytes.NewReader(data))
	if err != nil {
		return data
	}
        newImg := image.NewRGBA(imgSrc.Bounds())
	draw.Draw(newImg, newImg.Bounds(), &image.Uniform{C: color.White}, image.Point{}, draw.Src)
	draw.Draw(newImg, newImg.Bounds(), imgSrc, imgSrc.Bounds().Min, draw.Over)

	buf := bytes.Buffer{}
	err = jpeg.Encode(&buf, newImg, &jpeg.Options{Quality: 40})
	if err != nil {
		return data
	}
	if buf.Len() > len(data) {
		return data
	}
	return buf.Bytes()
}

  • 最后给大家分享一个超级好用PDF处理的golang 库: https://github.com/unidoc/unipdf。一开始使用这个库将生成后的PDF压缩的,可以将一个200M的PDF(里面都是图片)直接压缩到7M左右。可惜的是这个库商用需要购买商业版权,所以最后只能采取了导出前压缩图片的做法。
  • 这个库没有授权的情况下会在处理后的PDF中加上水印,这个想去掉也简单,fork下来改一下代码就好了。虽然我这里因为是商业的场景不能这么用,但是我还是尝试了下,仓库在这:https://github.com/lianggx6/unipdf。然后再在go.mod文件中将依赖替换即可。大家如果有个人开发实践需要的可以直接这样拿来用,商用务必购买版权。
replace (
	github.com/unidoc/unipdf/v3 => github.com/lianggx6/unipdf v0.0.0-20200409043947-1c871b2c4951
)

免责声明:文章转载自《Golang压缩Jpeg图片和PNG图片》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Vue(一)使用 ArcMap 创建城市格网下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转)字符编码笔记:ASCII,Unicode和UTF8

今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料。 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚。 下面就是我的笔记,主要用来整理自己的思路。但是,我尽量试图写得通俗易懂,希望能对其他朋友有用。毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识。 1. ASCII...

bat批量处理文件名(学习)

bat学习相关知识: 1.新建txt文件,修改.txt -> .bat,双击即可运行bat,右键编辑即可 2.bat 格式@echo off // 开头,如果没写,会把文件路径打印出来内容pause //结尾,如果没写,运行后,会一闪而过,关闭界面 3.bat 命令行跟dos是一样的,只是dos是在cmd中一行一行编辑,运行,而bat是在记事本中批量...

.9.png

.9.png是一种非失真性压缩位图图形文件格式。PNG格式是非失真性压缩的,允许使用类似于GIF格式的调色板技术,支持真彩色图像,并具备阿尔法通道(半透明)等特性。现在有很多人使用PNG格式于互联网及其他方面上。PNG的的英文名称为Portable Network Graphics,即便携式网络图片。另有说法是名称来源于非官方的“PNG is Not GI...

记一次golang的内存泄露

程序功能 此程序的主要功能是将文件中数据导入到clickhouse数据库中。 【问题描述】 服务器内存每隔一段时间会耗尽 【问题分析】 由于使用的是go语言开发的,所以采用了业界流行的工具pprof。 参考URL:https://cizixs.com/2017/09/11/profiling-golang-program/ 工具的使用与思路: 1)先修改...

Golang的高级数据类型-指针(Pointer)实战篇

          Golang的高级数据类型-指针(Pointer)实战篇                                作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。       前面分享过存储数据的方式,可以通过变量,或者复合类型中的数组,切片,Map,结构体等进行存储。今天我们来分享一下Go语言中的指针操作。   ...

golang json解析

前言 Go 语言自带的 encode/json 包提供了对 JSON 数据格式的编码和解码能力。 解析 JSON 的关键,其实在于如何声明存放解析后数据的变量的类型。 此外使用 json 编码还会有几个需要注意的地方,谨防踩坑。 解析简单JSON 先观察下这段 JSON 数据的组成,name,created 是字符串。id 是整型,fruit 是一个字符串...