使用Go裁剪和创建缩略图

Aid*_*den 4 go

有没有办法让我通过给出尺寸和偏移来裁剪图像?

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

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

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

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

Aid*_*den 11

我将回答我自己的问题,以便它可以帮助Go的其他新人.

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

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

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

  • 您能否分享使用矩形裁剪图像的示例代码?谢谢 (5认同)

425*_*esp 7

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

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)
}
Run Code Online (Sandbox Code Playgroud)