golang 实现 pdf 转高清晰度 jpeg
ImageMagick 是一个功能丰富的图片处理工具
具体安装方式可以参考官方,MacOS 上可以通过 homebrew 安装
brew install imagemagick@6
homebrew 最新的源是 7.* 版本,由于我的场景需要在 linux 部署,linux 的 apt 源目前是 6.9, 为了保持一致,所以使用的是旧版本
命令行使用
convert -density 128 1.pdf -quality 100 -alpha remove output.jpeg
Golang 代码使用
核心要点:
- pdf 需要去除 alpha 通道,然后背景色设置白色(你可以可以根据需求设置其它颜色)
- 留意内存泄露,因为这是 cgo,一旦泄露就 gg 了。比如你没有
mw.RemoveImage()
- 上述的 density 设置就是 resolution, 需要设置一个合理的值,否则转换的图片就会糊
golang 的 binding 安装方式可以按照 github 介绍 https://github.com/gographics/imagick
package main
import (
"fmt"
"io/ioutil"
"runtime"
"runtime/debug"
"time"
"gopkg.in/gographics/imagick.v2/imagick"
)
func main() {
imagick.Initialize()
//defer imagick.Terminate()
data, _ := ioutil.ReadFile("1.pdf")
start := time.Now()
for i := 0; i < 100; i {
if i == 0 {
fmt.Println("i", i)
}
go createCoverImage(data, "1-1.jpeg")
}
fmt.Println("duration", time.Now().Sub(start))
PrintMemUsage()
debug.FreeOSMemory()
PrintMemUsage()
time.Sleep(10 * time.Second)
imagick.Terminate()
fmt.Println("free cgo")
PrintMemUsage()
time.Sleep(10 * time.Minute)
}
// PrintMemUsage outputs the current, total and OS memory being used. As well as the number
// of garage collection cycles completed.
func PrintMemUsage() {
var m runtime.MemStats
runtime.ReadMemStats(&m)
// For info on each, see: https://golang.org/pkg/runtime/#MemStats
fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
fmt.Printf("\tNumGC = %v\n", m.NumGC)
}
func bToMb(b uint64) uint64 {
return b / 1024 / 1024
}
func clearImagickWand(mw *imagick.MagickWand) {
mw.RemoveImage()
mw.Clear()
mw.Destroy()
//runtime.SetFinalizer(mw, nil)
mw = nil
}
func createCoverImage(data []byte, coverPathName string) bool {
//sourceImagePath := getSourceImageForCover(filepath.Dir(pathNoExtension))
mw := imagick.NewMagickWand()
defer clearImagickWand(mw)
mw.SetResolution(192, 192)
err := mw.ReadImageBlob(data)
if err != nil {
return false
}
//length := mw.GetImageIterations()
//fmt.Println("length", length)
//fmt.Println("width", mw.GetImageWidth())
//fmt.Println("height", mw.GetImageHeight())
pix := imagick.NewPixelWand()
pix.SetColor("white")
//mw.SetBackgroundColor(pix)
mw.SetImageAlphaChannel(imagick.ALPHA_CHANNEL_REMOVE)
mw.SetImageFormat("jpeg")
err = mw.WriteImage(coverPathName)
if err != nil {
return false
}
_ = mw.GetImageBlob()
return true
}
特别地,需要设置两个环境变量
export CGO_CFLAGS_ALLOW='-Xpreprocessor'
export PKG_CONFIG_PATH="/usr/local/opt/imagemagick@6/lib/pkgconfig" # 取决于 brew install 的输出
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfbcag
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01