1 回答
TA贡献1719条经验 获得超6个赞
对于将来遇到这个问题的任何人 - 我找到了一个解决方法。我对它并不感到兴奋,但它很实用。
本质上,我能够获取存储读取器的内容,然后在 Cloud Functions 上下文中创建我自己的 os.File 对象。然后,将该 os.File 传递给 exec.Cmd 调用。这绝对不理想,但代码如下:
func Overlay(ctx context.Context, inputBucket, outputBucket, background string, foreground string, output string) (string, error) {
// Retrieve the Background Image from the storage API
backgroundBlob := storageClient.Bucket(inputBucket).Object(background)
backgroundImg, err := backgroundBlob.NewReader(ctx)
if err != nil {
return "", fmt.Errorf("backgroundImg: %v", err)
}
// Read the contents of the file into a variable
backgroundSlurp, err := ioutil.ReadAll(backgroundImg)
if err != nil {
return "", fmt.Errorf("readFile: unable to read data from bucket %q, file %q: %v", inputBucket, background, err)
}
// Write the contents of Background Image to an os.File instance
err = ioutil.WriteFile(fmt.Sprintf("/tmp/%s",background), backgroundSlurp, 0644)
if err != nil {
return "", fmt.Errorf("backgroundImg: %v", err)
}
// Open the os.File instance to pass it on to os.exec later
backgroundFile, err := os.Open(fmt.Sprintf("/tmp/%s",background))
if err != nil {
return "", fmt.Errorf("backgroundFile: %v", err)
}
foregroundBlob := storageClient.Bucket(inputBucket).Object(foreground)
foregroundImg, err := foregroundBlob.NewReader(ctx)
if err != nil {
return "", fmt.Errorf("foregroundImg: %v", err)
}
// Read the contents of the file into a variable
foreroundSlurp, err := ioutil.ReadAll(foregroundImg)
if err != nil {
return "", fmt.Errorf("readFile: unable to read data from bucket %q, file %q: %v", inputBucket, foreground, err)
}
// Write the contents of Foreground Image to an os.File instance
err = ioutil.WriteFile(fmt.Sprintf("/tmp/%s",foreground), foreroundSlurp, 0644)
if err != nil {
return "", fmt.Errorf("foregroundImg: %v", err)
}
// Open the os.File instance to pass it on to os.exec later
foregroundFile, err := os.Open(fmt.Sprintf("/tmp/%s",foreground))
if err != nil {
return "", fmt.Errorf("foregroundFile: %v", err)
}
outputBlob := storageClient.Bucket(outputBucket).Object(output)
outputImg := outputBlob.NewWriter(ctx)
defer outputImg.Close()
// Set up some additional file handles since we're delaqing with more inputs than STDIN Can cope with
cmd := exec.Command("convert", "fd:3", "fd:4", "-composite", "-")
cmd.Stdout = outputImg
cmd.ExtraFiles = append(cmd.ExtraFiles,backgroundFile)
cmd.ExtraFiles = append(cmd.ExtraFiles,foregroundFile)
if err := cmd.Run(); err != nil {
return "", fmt.Errorf("cmd.Run: %v", err)
}
log.Printf("Blurred image has been uploaded to %s", outputBlob.ObjectName())
return outputBlob.ObjectName(), nil
}
- 1 回答
- 0 关注
- 121 浏览
添加回答
举报