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 關注
- 162 瀏覽
添加回答
舉報