gpt4 book ai didi

image-processing - 如何将 exec.Command 包装在 io.Writer 中

转载 作者:IT王子 更新时间:2023-10-29 01:44:41 24 4
gpt4 key购买 nike

我正在尝试使用 mozjpeg 压缩 JPEG 图像。由于它没有正式的 go 绑定(bind),我想我将调用它的 CLI 来进行压缩。

我尝试在 compress/gzip 之后模拟用法:

c := jpeg.NewCompresser(destFile)
_, err := io.Copy(c, srcFile)

现在的问题是,我如何将 CLI 包装在 Compresser 中,以便它可以支持这种用法?

我试过这样的:

type Compresser struct {
cmd exec.Command
}

func NewCompressor(w io.Writer) *Compresser {
cmd := exec.Command("jpegtran", "-copy", "none")
cmd.Stdout = w
c := &Compresser{cmd}
return c
}

func (c *Compresser) Write(p []byte) (n int, err error) {
if c.cmd.Process == nil {
err = c.cmd.Start()
if err != nil {
return
}
}
// How do I write p into c.cmd.Stdin?
}

但无法完成。

另外,第二个问题是,什么时候关闭命令?如何关闭命令?

最佳答案

你应该看看 Cmd.StdinPipe .文档中有一个适合您情况的示例:

package main

import (
"fmt"
"io"
"log"
"os/exec"
)

func main() {
cmd := exec.Command("cat")
stdin, err := cmd.StdinPipe()
if err != nil {
log.Fatal(err)
}

go func() {
defer stdin.Close()
io.WriteString(stdin, "values written to stdin are passed to cmd's standard input")
}()

out, err := cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}

fmt.Printf("%s\n", out)
}

在这种情况下,CombinedOutput() 执行您的命令,当没有更多字节可从out 读取时,执行结束。

关于image-processing - 如何将 exec.Command 包装在 io.Writer 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45298749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com