我正在使用以下代码从Amazon s3获取对象并执行调整大小和裁剪之后。我想把它存放在s3上。但问题是我无法将mw (Image maigck object)
转换为字节数组。将用于将其存储在s3上。此外,在当前的方法中,它使用jpeg.Encode。如果.png或.gif格式的图像怎么办?我们如何将其转换为[]字节?
请您告诉我如何通过宽高比而不是裁剪坐标来均匀裁剪图像。 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)
答案 0 :(得分:2)
您需要使用func (mw *MagickWand) GetImageBlob() []byte
功能。
它返回一个字节片段,其中包含当前文件格式(JPEG,gif,PNG ...)的完整编码图像。
因此可以将返回的数据保存到磁盘,或按原样发送到s3。
有关文档,请参阅https://gowalker.org/github.com/gographics/imagick/imagick#MagickWand_GetImageBlob。
答案 1 :(得分:1)
这个问题实际上是两个问题,@ SirDarius通过建议使用GetImageBlob()
来回答其中一个问题。您还可以在生成blob之前使用SetImageFormat()
更改图像格式。
关于裁剪的部分,我确信有很多方法可以使用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)
...