在Go语言中创建一个返回Image Magick对象的函数,返回类型为图像魔术对象。

huangapple go评论94阅读模式
英文:

Create a function with return type of image magick object in go lang

问题

我想创建与存储在S3中的图像对应的ImageMagick对象。因此,我正在编写一个函数,该函数将接受必要的参数并返回ImageMagick对象。但是,我没有成功。这是我正在使用的Imagick库

func main() {
    mw := imagick.NewMagickWand()
    defer mw.Destroy()
    mw = ObjImagick(bucketName, keyName, region)
}

func ObjImagick(bktName string, kName string, region string) () {

    s3Client := s3.New(session.New(), &aws.Config{Region: aws.String(region)})
    params := &s3.GetObjectInput{
        Bucket: aws.String(bktName),
        Key:    aws.String(kName),
    }

    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()
    defer mw.Destroy()

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

    return mw
}
英文:

I want to create image magick object corresponding to images stroed in S3. So, i was writing a function which will take necessary arguments and return the image magick object. But, no luck with it. This is the Imagick Library which i am using.

     func main() {
        mw := imagick.NewMagickWand()
    	defer mw.Destroy()
    	mw = ObjImagick(bucketName, keyName, region)
    }

  

  func ObjImagick(bktName string, kName string, region string) ( ) {

	s3Client := s3.New(session.New(), &aws.Config{Region: aws.String(region)})
        params := &s3.GetObjectInput{
		Bucket: aws.String(bktName),
		Key: aws.String(kName),
	    }

	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()
	defer mw.Destroy()

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

       return mw
}

答案1

得分: 2

好的,以下是翻译好的内容:

func ObjImagick(bktName string, kName string, region string) *imagick.MagickWand {
    .......................
    mw := imagick.NewMagickWand()
    // defer mw.Destroy() 这会在 ObjMagick 返回时销毁 wand。
    // 所以你不能在这里调用它,你的函数调用者需要处理销毁对象的操作。

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

    return mw
}

然后调用者需要调用 `.Destroy()`例如

func main() {
    mw := ObjImagick(bucketName, keyName, region)
    defer mw.Destroy()
}

希望对你有帮助!如果还有其他问题,请随时提问。

英文:

Well, NewMagickWand() returns a *MagickWand, so you can create your function like:

func ObjImagick(bktName string, kName string, region string) *imagick.MagickWand {
	.......................
	mw := imagick.NewMagickWand()
	// defer mw.Destroy() this destroys the wand when ObjMagick returns.
	// so you can't do this here, your func caller needs to handle destroying the object.

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

	return mw
}

Then the caller has to call .Destroy(), for example:

func main() {
	mw := ObjImagick(bucketName, keyName, region)
	defer mw.Destroy()
}

huangapple
  • 本文由 发表于 2016年2月3日 14:02:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/35169590.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定