golang 实现 pdf 转高清晰度 jpeg的处理方法
短信预约 -IT技能 免费直播动态提醒
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%10 == 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 的输出
Golang PDF转JPEG
package main
import (
"fmt"
"os"
"github.com/h2non/bimg"
)
func main() {
buffer, err := bimg.Read("test.pdf")
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
newImage, err := bimg.NewImage(buffer).Convert(bimg.JPEG)
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
if bimg.NewImage(newImage).Type() == "jpeg" {
fmt.Fprintln(os.Stderr, "The image was converted into jpeg")
}
bimg.Write("test.jpg", newImage)
}
到此这篇关于golang 实现 pdf 转高清晰度 jpeg的文章就介绍到这了,更多相关golang pdf 转高清晰度 jpeg内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341