golang 实现 pdf 转高清晰度 jpeg的处理方法
2022-10-09 17:01:43 来源:易采站长站 作者:
ImageMagick 是一个功能丰富的图片处理工具
具体安装方式可以参考官方,MacOS 上可以通过 homebrew 安装
brew install [email protected]
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="[email protected]/lib/pkgconfig" # 取决于 brew install 的输出
Golang>
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内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!
暂时禁止评论