为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 将 Image magick 对象转换为 []byte

Golang 将 Image magick 对象转换为 []byte

Go
哆啦的时光机 2021-12-07 18:29:15
我正在使用以下代码从 Amazon s3 中获取对象,并在执行调整大小和裁剪之后。我想将它存储在 s3 上。但问题是我无法将其转换mw (Image maigck object)为字节数组。这将用于将其存储在 s3 上。此外,在当前方法中,它使用 jpeg.Encode。如果图像为 .png 或 .gif 格式怎么办。我们将如何将其转换为 []byte?您能否还告诉我如何仅通过纵横比而不是裁剪坐标来均匀裁剪图像。imgStream.Crop((int)originalWidth, ((int)(originalWidth / masterAspectRatio)), Gravity.Center)就像我们在 .net 中所做的那样。我问的原因是库中没有提供这种灵活性的方法。s3Client := s3.New(session.New(), &aws.Config{Region: aws.String(region)})            params := &s3.GetObjectInput{            Bucket: aws.String(bucketName),            Key: aws.String(keyName),            }        out, err := s3Client.GetObject(params)        if err != nil {             log.Fatal(err)        }        img, err := ioutil.ReadAll(out.Body)        if err != nil {            log.Fatal(err)        }              mw := imagick.NewMagickWand()           err = mw.ReadImageBlob(img)        if err != nil {            log.Fatal(err)        }        //Perform resizing and cropping on mw object        buf := new(bytes.Buffer)        err = jpeg.Encode(buf, mw, nil)        sendmw_s3 := buf.Bytes()         paramsPut := &s3.PutObjectInput{                        Bucket:         aws.String(masterBucketName),                        Key:            aws.String(keyName),                        Body:         bytes.NewReader(sendmw_s3),                }        resp, err := s3Client.PutObject(paramsPut)        if err != nil {            log.Fatal(err)        }错误 : cannot use mw (type *imagick.MagickWand) as type image.Image in argument to jpeg.Encode:    *imagick.MagickWand does not implement image.Image (missing At method)
查看完整描述

2 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

您需要使用该func (mw *MagickWand) GetImageBlob() []byte功能。

它返回包含当前文件格式(JPEG、gif、PNG...)的完整编码图像的字节切片。

因此,返回的数据可以保存到磁盘,或按原样发送到 s3。

有关文档,请参阅https://gowalker.org/github.com/gographics/imagick/imagick#MagickWand_GetImageBlob


查看完整回答
反对 回复 2021-12-07
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

这个问题实际上是两个问题,@SirDarius 通过建议使用GetImageBlob(). 您还可以使用SetImageFormat()在生成 blob 之前更改图像格式。


对于关于裁剪的部分,我相信 ImageMagick 有很多方法可以做到这一点。我这样做的方法是,实现中心裁剪是首先转换图像,使较小的尺寸适合我想要的目标分辨率。然后裁剪掉溢出的部分。


// Create a new image where smallest dimension is fit

// and the rest overflows the dimensions

size := fmt.Sprintf("%dx%d^+0+0", w, h)

tx := wand.TransformImage("", size)


// Center Crop away the extra parts of the image, to perform

tx.SetImageGravity(imagick.GRAVITY_CENTER)

offsetX := -(int(w) - int(tx.GetImageWidth())) / 2

offsetY := -(int(h) - int(tx.GetImageHeight())) / 2

err := tx.ExtentImage(w, h, offsetX, offsetY)

...


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 306 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信