我需要用 ImageMagick 添加水印,出于某種原因,我需要用 golang 運行它。
這是我的代碼片段
package main
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"runtime"
"strings"
)
func main() {
currentDir, _ := os.Getwd()
sourceImg := os.Args[1]
sourceName := filepath.Base(sourceImg)
sourceExt := filepath.Ext(sourceImg)
imgNameWithoutExt := strings.Replace(sourceName, sourceExt, "", 1)
targetImgName := imgNameWithoutExt "_wm" sourceExt
targetImg := filepath.Join(filepath.Dir(sourceImg), targetImgName)
command := "bash"
secondParam := "-c"
// In macOS or Linux, use backslash to escape parenthesis
cmdStr := `magick "` sourceImg `" -set option:watermarkWidth "%[fx:int(w*0.25)]" -alpha set -background none \\( -fill "#FFFFFF80" -stroke "#FF000080" -strokeWidth 3 -undercolor "#FF000080" -font "arial.ttf" -size "%[watermarkWidth]x" label:"This is watermark" -gravity center -geometry 10 10 -rotate -30 \\) -composite -quality 40 "` targetImg `"`
if runtime.GOOS == "windows" {
sourceImg = strings.ReplaceAll(sourceImg, "\\", "\\\\")
targetImg = strings.ReplaceAll(targetImg, "\\", "\\\\")
// In PowerShell, use babckstick (`) to escape parenthesis
command = "cmd"
secondParam = "/c"
cmdStr = `magick "` sourceImg `" -set option:watermarkWidth "%[fx:int(w*0.25)]" -alpha set -background none ` "`(" ` -fill "#FFFFFF80" -stroke "#FF000080" -strokeWidth 3 -undercolor "#FF000080" -font "arial.ttf" -size "%[watermarkWidth]x" label:"This is watermark" -gravity center -geometry 10 10 -rotate -30 ` "`)" ` -composite -quality 40 "` targetImg `"`
}
fmt.Println(cmdStr)
cmd := exec.Command(command, secondParam, cmdStr)
cmd.Dir = currentDir
ouput, err := cmd.Output()
if err != nil {
fmt.Println("Error:", ouput, err.Error())
} else {
fmt.Println("Watermark was successfully added!")
}
}
Because I've use os.Getwd() in the code, so we cannot run it directly through go run main.go, instead, we should build an executable
# build Windows executable
GOOS=windows GOARCH=amd64 go build -ldflags "-w -s" -o "test-magick.exe" main.go
# build macOS executable
GOOS=darwin GOARCH=amd64 go build -ldflags "-w -s" -o "test-magick" main.go
# build Linux executable(I didn't test)
GOOS=linux GOARCH=amd64 go build -ldflags "-w -s" -o "test-magick" main.go
On macOS, the executable works fine, the watermark was successfully added

On Windows(in PowerShell), it returns an error, actually no specified error message, it just failed

Anyone who knows how to solve this error?
uj5u.com熱心網友回復:
您沒有使用PowerShell從 Go 應用程式內部呼叫可執行檔案,您使用cmd.exe的是具有不同語法規則的 PowerShell(它不將`(反引號)識別為轉義字符,%是元字符,不支持轉義"為\", ...)
因此,由于您錯誤地將專為powershell.exe(Windows PowerShell CLI)設計的命令列傳遞給cmd.exe舊的 Windows shell,由于語法差異而失敗。
因此,替換:
command = "cmd"
secondParam = "/c"
和:
command = "powershell.exe"
secondParam = "-c"
此外,考慮在 之前放置以下引數-c,以增加穩健性:
"-ExecutionPolicy", "Bypass", "-NoProfile"
請參閱powershell.exe.
退后一步:
您的可執行呼叫不使用任何shell 功能(例如重定向到檔案、通過管道連接多個命令……),因此您可以簡單地magic 直接呼叫,并將所有引數單獨傳遞給exec.Command(),從而加快操作并避免需要轉義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/457424.html
標籤:powershell go cmd imagemagick watermark
上一篇:io閱讀器客戶端使用方法
