要按照指定形状裁剪图片,可以使用 Go 语言的 image 包和 draw 包。

首先,我们需要读取原始图片,可以使用 image.Decode() 函数:

file, err := os.Open('path/to/image.jpg')
if err != nil {
    log.Fatal(err)
}
defer file.Close()

img, _, err := image.Decode(file)
if err != nil {
    log.Fatal(err)
}

接下来,我们需要创建一个与原始图片尺寸相同的空白画布,用于绘制裁剪后的图片:

width := img.Bounds().Max.X
height := img.Bounds().Max.Y
canvas := image.NewRGBA(image.Rect(0, 0, width, height))

现在,我们可以使用 draw 包的 DrawMask() 函数,将原始图片的指定区域绘制到空白画布上。这里我们可以使用一个圆形的掩膜来裁剪图片:

mask := image.NewRGBA(image.Rect(0, 0, width, height))
draw.DrawMask(mask, mask.Bounds(), &image.Uniform{color.Black}, image.Point{}, &circle{image.Point{width/2, height/2}, width/2}, image.Point{}, draw.Src)

draw.DrawMask(canvas, canvas.Bounds(), img, image.Point{}, mask, image.Point{}, draw.Over)

其中,circle 结构体表示圆形掩膜的中心坐标和半径:

type circle struct {
    p image.Point
    r int
}

func (c *circle) ColorModel() color.Model {
    return color.AlphaModel
}

func (c *circle) Bounds() image.Rectangle {
    return image.Rect(c.p.X-c.r, c.p.Y-c.r, c.p.X+c.r, c.p.Y+c.r)
}

func (c *circle) At(x, y int) color.Color {
    xx, yy, rr := float64(x-c.p.X)+0.5, float64(y-c.p.Y)+0.5, float64(c.r)
    if xx*xx+yy*yy < rr*rr {
        return color.Alpha{255}
    }
    return color.Alpha{0}
}

最后,我们可以将裁剪后的图片保存为新的文件:

out, err := os.Create('path/to/new_image.jpg')
if err != nil {
    log.Fatal(err)
}
defer out.Close()

jpeg.Encode(out, canvas, nil)

完整的代码如下:

package main

import (
    "image"
    "image/color"
    "image/draw"
    "image/jpeg"
    "log"
    "os"
)

type circle struct {
    p image.Point
    r int
}

func (c *circle) ColorModel() color.Model {
    return color.AlphaModel
}

func (c *circle) Bounds() image.Rectangle {
    return image.Rect(c.p.X-c.r, c.p.Y-c.r, c.p.X+c.r, c.p.Y+c.r)
}

func (c *circle) At(x, y int) color.Color {
    xx, yy, rr := float64(x-c.p.X)+0.5, float64(y-c.p.Y)+0.5, float64(c.r)
    if xx*xx+yy*yy < rr*rr {
        return color.Alpha{255}
    }
    return color.Alpha{0}
}

func main() {
    file, err := os.Open('path/to/image.jpg')
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    img, _, err := image.Decode(file)
    if err != nil {
        log.Fatal(err)
    }

    width := img.Bounds().Max.X
    height := img.Bounds().Max.Y
    canvas := image.NewRGBA(image.Rect(0, 0, width, height))

    mask := image.NewRGBA(image.Rect(0, 0, width, height))
    draw.DrawMask(mask, mask.Bounds(), &image.Uniform{color.Black}, image.Point{}, &circle{image.Point{width/2, height/2}, width/2}, image.Point{}, draw.Src)

    draw.DrawMask(canvas, canvas.Bounds(), img, image.Point{}, mask, image.Point{}, draw.Over)

    out, err := os.Create('path/to/new_image.jpg')
    if err != nil {
        log.Fatal(err)
    }
    defer out.Close()

    jpeg.Encode(out, canvas, nil)
}

这里我们使用了一个圆形掩膜来裁剪图片,也可以使用其他形状的掩膜来实现不同的裁剪效果。

Golang 图片裁剪:指定形状裁剪图片教程

原文地址: https://www.cveoy.top/t/topic/nQmV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录