Files
photoview/api/scanner/media_encoding/executable_worker/magickwand.go
Googol Lee 0da8bef69e Update log for passing attrs with context. (#1216)
* Update log for passing attrs with context.

* Check type-casting

* add tests.

* Use t.Cleanup() to restore the global value.

* Fix error.

* Update tests.

* Add comments.

* Remove cover.cov

* Update doc.

* Update git ignore.
2025-06-07 17:11:50 +02:00

112 lines
2.7 KiB
Go

package executable_worker
import (
"fmt"
"github.com/photoview/photoview/api/log"
"gopkg.in/gographics/imagick.v3/imagick"
)
type MagickWand struct {
initialized bool
}
func newMagickWand() *MagickWand {
imagick.Initialize()
verstr, vernum := imagick.GetVersion()
log.Info(nil, "Found magickwand worker: "+verstr, "version", vernum)
return &MagickWand{
initialized: true,
}
}
func (cli *MagickWand) Terminate() {
cli.initialized = false
imagick.Terminate()
}
func (cli *MagickWand) IsInstalled() bool {
return cli != nil && cli.initialized
}
func (cli *MagickWand) EncodeJpeg(inputPath string, outputPath string, jpegQuality uint) error {
if !cli.IsInstalled() {
return fmt.Errorf("ImagickWand is not initialized")
}
wand := imagick.NewMagickWand()
defer wand.Destroy()
if err := wand.ReadImage(inputPath); err != nil {
return fmt.Errorf("ImagickWand read %q error: %w", inputPath, err)
}
if err := wand.SetFormat("JPEG"); err != nil {
return fmt.Errorf("ImagickWand set JPEG format for %q error: %w", inputPath, err)
}
if err := wand.SetImageCompressionQuality(jpegQuality); err != nil {
return fmt.Errorf("ImagickWand set JPEG quality %d for %q error: %w", jpegQuality, inputPath, err)
}
if err := wand.WriteImage(outputPath); err != nil {
return fmt.Errorf("ImagickWand write %q error: %w", outputPath, err)
}
return nil
}
func (cli *MagickWand) GenerateThumbnail(inputPath string, outputPath string, width, height uint) error {
if !cli.IsInstalled() {
return fmt.Errorf("ImagickWand is not initialized")
}
wand := imagick.NewMagickWand()
defer wand.Destroy()
if err := wand.ReadImage(inputPath); err != nil {
return fmt.Errorf("ImagickWand read %q error: %w", inputPath, err)
}
if err := wand.ThumbnailImage(width, height); err != nil {
return fmt.Errorf("ImagickWand generate thumbnail for %q error: %w", inputPath, err)
}
if err := wand.SetFormat("JPEG"); err != nil {
return fmt.Errorf("ImagickWand set JPEG format for %q error: %w", inputPath, err)
}
if err := wand.SetImageCompressionQuality(70); err != nil {
return fmt.Errorf("ImagickWand set JPEG quality %d for %q error: %w", 70, inputPath, err)
}
if err := wand.WriteImage(outputPath); err != nil {
return fmt.Errorf("ImagickWand write %q error: %w", outputPath, err)
}
return nil
}
func (cli *MagickWand) IdentifyDimension(inputPath string) (width, height uint, err error) {
if !cli.IsInstalled() {
err = fmt.Errorf("ImagickWand is not initialized")
return
}
wand := imagick.NewMagickWand()
defer wand.Destroy()
if errRI := wand.ReadImage(inputPath); errRI != nil {
err = fmt.Errorf("ImagickWand read %q error: %w", inputPath, errRI)
return
}
width = wand.GetImageWidth()
height = wand.GetImageHeight()
return
}