首頁 > 軟體

golang 實現 pdf 轉高清晰度 jpeg的處理方法

2022-10-10 14:01:00

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 = %vn", 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內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com