【问题标题】:Create Image magick object from response stream in go lang从 golang 中的响应流创建 Imagemagick 对象
【发布时间】:2016-01-27 11:32:49
【问题描述】:

我正在使用以下代码从Amazon S3 下载和上传图片。现在,在下载图像后,我想使用imagick library 调整它的大小,但不将其写入磁盘。那么,我如何直接从我将从 S3 获得的响应流创建图像魔法对象并将其上传到 Amazon S3 上。您能否建议在下面的代码中进行相同的更改? 另外,如何将其更改为从查询字符串中获取键值的 http 处理程序?

我已经注释掉了我的图像魔法对象代码,因为我知道如何编写它。

func main() {
    file, err := os.Create("download_file")

        if err != nil {
            log.Fatal("Failed to create file", err)
        }
        defer file.Close()

        downloader := s3manager.NewDownloader(session.New(&aws.Config{Region: aws.String(REGION_NAME)}))
        numBytes, err := downloader.Download(file,
            &s3.GetObjectInput{
            Bucket: aws.String(BUCKET_NAME),
            Key:    aws.String(KEY),
            })
        if err != nil {
            fmt.Println("Failed to download file", err)
            return
        }

        fmt.Println("Downloaded file", file.Name(), numBytes, "bytes")                   

     //mw := imagick.NewMagickWand()
     //   defer mw.Destroy()

     //  err = mw.ReadImage(file)
     //  if err != nil {
     //      panic(err)
     //   }  
        // using io.Pipe read/writer file contents.
        reader, writer := io.Pipe()

        go func() {
        io.Copy(writer, file)

        file.Close()
        writer.Close()
        }()
        uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String(REGION_NAME)}))
        result, err := uploader.Upload(&s3manager.UploadInput{
        Body:   reader,
        Bucket: aws.String(BUCKET),
        Key:    aws.String(KEY),
        })

        if err != nil {
        log.Fatalln("Failed to upload", err)
        }

        log.Println("Successfully uploaded to", result.Location)
            fmt.Println("code ran successfully") 
}

【问题讨论】:

  • 我在您的示例中看不到任何图像代码。您在将图像加载到 imagick 时遇到问题吗?如果您不想要文件,为什么要下载到文件?
  • 什么是“图像魔术对象”?
  • @JimB 如果,我知道如何从响应流创建对象。为什么我会问这个问题。无论如何,我需要即时调整图像大小。因为,图像存储在 S3 上。所以,我需要在此之前将它们下载到 EC2 上。所以,为了避免磁盘 io,我想把它保存在内存中。因此,问了这个问题,如何在 go lang 中从响应流创建图像魔法对象。你到底为什么对我的问题投了反对票?
  • @Volker 这是一个用于图像处理的库,它在 golang 中的包装器称为 imagick。我还提供了问题中的链接。顺便说一句,我不明白你为什么拒绝我的问题。
  • ImageMagick 不对“流”进行操作,但它确实将内存中的图像称为“blob”。要从 []byte 读取图像,请使用 ReadImageBlob

标签: go amazon-s3 go-imagick


【解决方案1】:

如果您想更有效地下载大文件,您只需要一个 DownloadManager。 DownloadManager 需要 WriterAt(通常是 os.File),您必须自己通过 []byte 实现它或使用内存中的文件。

如果直接获取对象,可以将其读入[]byte,可以传递给ReadImageBlob

out, err := s3Client.GetObject(&s3.GetObjectInput{
    Bucket: aws.String(BUCKET),
    Key:    aws.String(KEY),
})
if err != nil {
    log.Fatal(err)
}

img, err := ioutil.ReadAll(out.Body)
if err != nil {
    log.Fatal(err)
}

mw := imagick.NewMagickWand()
defer mw.Destroy()

err = mw.ReadImageBlob(img)
if err != nil {
    log.Fatal(err)
}
...

【讨论】:

  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2022-11-13
  • 2011-02-21
  • 2022-07-30
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多