使用 Go 裁剪和创建缩略图

有没有办法通过提供尺寸和偏移量来使用 Go 裁剪图像?

我正在考虑像这个 php 函数这样灵活的东西:http : //php.net/manual/en/function.imagecopyresampled.php

我发现了这个:https : //github.com/nfnt/resize 但是那个库似乎没有偏移选项。

我需要能够裁剪原始图像的任何区域。不仅缩小,而且裁剪图像的不同定位。

关于如何实现这一目标的任何建议?


繁星淼淼
浏览 257回答 3
3回答

交互式爱情

我将回答我自己的问题,以便对其他 Go 新手有所帮助。阅读这两篇文章对我了解如何在 Go 中裁剪图像有很大帮助。不需要第三个库。您决定如何使用点和矩形裁剪图像,这是一种非常简洁的方法。http://blog.golang.org/go-image-packagehttp://blog.golang.org/go-imagedraw-package

慕虎7371278

这是一个裁剪图像的简单程序。如果在给定矩形之外切掉图像。package mainimport (    "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)}

ITMISS

在这个答案中有更好的解释。SubImage 方法是为大多数图像格式实现的(似乎除了Uniform)。由于它不属于主界面,因此您需要对其进行断言才能使用它。package mainimport (    "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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go