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

使用 Go 裁剪和创建缩略图

使用 Go 裁剪和创建缩略图

Go
繁星淼淼 2021-11-08 14:50:33
有没有办法通过提供尺寸和偏移量来使用 Go 裁剪图像?我正在考虑像这个 php 函数这样灵活的东西:http : //php.net/manual/en/function.imagecopyresampled.php我发现了这个:https : //github.com/nfnt/resize 但是那个库似乎没有偏移选项。我需要能够裁剪原始图像的任何区域。不仅缩小,而且裁剪图像的不同定位。关于如何实现这一目标的任何建议?
查看完整描述

3 回答

?
交互式爱情

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

我将回答我自己的问题,以便对其他 Go 新手有所帮助。

阅读这两篇文章对我了解如何在 Go 中裁剪图像有很大帮助。不需要第三个库。您决定如何使用点和矩形裁剪图像,这是一种非常简洁的方法。

http://blog.golang.org/go-image-package

http://blog.golang.org/go-imagedraw-package


查看完整回答
反对 回复 2021-11-08
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

这是一个裁剪图像的简单程序。如果在给定矩形之外切掉图像。


package main


import (

    "fmt"

    "image"

    "log"

    "os"


    "image/png"

)


func main() {

    if err := run(); err != nil {

        log.Fatalln(err)

    }

}


func run() error {

    img, err := readImage("pic.png")

    if err != nil {

        return err

    }


    // I've hard-coded a crop rectangle, start (0,0), end (100, 100).

    img, err = cropImage(img, image.Rect(0, 0, 100, 100))

    if err != nil {

        return err

    }


    return writeImage(img, "pic-cropped.png")

}


// readImage reads a image file from disk. We're assuming the file will be png

// format.

func readImage(name string) (image.Image, error) {

    fd, err := os.Open("pic.png")

    if err != nil {

        return nil, err

    }

    defer fd.Close()


    // image.Decode requires that you import the right image package. We've

    // imported "image/png", so Decode will work for png files. If we needed to

    // decode jpeg files then we would need to import "image/jpeg".

    //

    // Ignored return value is image format name.

    img, _, err := image.Decode(fd)

    if err != nil {

        return nil, err

    }


    return img, nil

}


// cropImage takes an image and crops it to the specified rectangle.

func cropImage(img image.Image, crop image.Rectangle) (image.Image, error) {

    type subImager interface {

        SubImage(r image.Rectangle) image.Image

    }


    // img is an Image interface. This checks if the underlying value has a

    // method called SubImage. If it does, then we can use SubImage to crop the

    // image.

    simg, ok := img.(subImager)

    if !ok {

        return nil, fmt.Errorf("image does not support cropping")

    }


    return simg.SubImage(crop), nil

}


// writeImage writes an Image back to the disk.

func writeImage(img image.Image, name string) error {

    fd, err := os.Create(name)

    if err != nil {

        return err

    }

    defer fd.Close()


    return png.Encode(fd, img)

}



查看完整回答
反对 回复 2021-11-08
?
ITMISS

TA贡献1871条经验 获得超8个赞

在这个答案中有更好的解释。SubImage 方法是为大多数图像格式实现的(似乎除了Uniform)。由于它不属于主界面,因此您需要对其进行断言才能使用它。


package main


import (

    "fmt"

    "image"

    "image/jpeg"

    "log"

    "os"

)


func main() {

    image_file, err := os.Open("somefile.jpeg")

    if err != nil {

        log.Fatal(err)

    }

    my_image, err := jpeg.Decode(image_file)

    if err != nil {

        log.Fatal(err)

    }


    my_sub_image := my_image.(interface {

        SubImage(r image.Rectangle) image.Image

    }).SubImage(image.Rect(0, 0, 10, 10))


    output_file, outputErr := os.Create("output.jpeg")

    if outputErr != nil {

        log.Fatal(outputErr)

    }

    jpeg.Encode(output_file, my_sub_image, nil)


}


查看完整回答
反对 回复 2021-11-08
  • 3 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

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