欢迎访问宙启技术站
智能推送

golang image图片处理示例

发布时间:2023-05-16 02:20:02

Go语言可以用来处理图片,其中一个著名的库就是Go语言自带的image。该库可以让我们轻松的创建和操作图片。本文将介绍一些Go语言image处理的示例。

1. 创建一张简单的图片

我们可以使用image库来创建一张简单的图片。下面是一个简单示例,创建了一个红色的正方形图片。

package main

import (
    "image"
    "image/color"
    "image/png"
    "os"
)

func main() {
    img := image.NewRGBA(image.Rect(0, 0, 200, 200))

    // 填充红色
    for y := 0; y < img.Bounds().Dy(); y++ {
        for x := 0; x < img.Bounds().Dx(); x++ {
            img.Set(x, y, color.RGBA{255, 0, 0, 255})
        }
    }

    // 保存图片
    f, _ := os.Create("red.png")
    defer f.Close()
    _ = png.Encode(f, img)
}

2. 缩放图片

使用Go语言的image库可以轻松缩放图片。下面是一个简单的示例,缩放一张图片的宽度为一半。

package main

import (
    "image"
    "image/jpeg"
    "os"
)

func main() {
    // 打开图片
    f, _ := os.Open("img.jpg")
    defer f.Close()
    img, _ := jpeg.Decode(f)

    // 缩放图片
    w := img.Bounds().Dx() / 2
    h := img.Bounds().Dy()
    newImg := image.NewRGBA(image.Rect(0, 0, w, h))
    for y := 0; y < h; y++ {
        for x := 0; x < w; x++ {
            newImg.Set(x, y, img.At(x*2, y))
        }
    }

    // 保存图片
    f, _ = os.Create("img_half.jpg")
    defer f.Close()
    _ = jpeg.Encode(f, newImg, nil)
}

3. 图片旋转

使用Go语言的image库可以轻松旋转图片。下面是一个简单的示例,将一张图片旋转90度。

package main

import (
    "image"
    "image/jpeg"
    "math"
    "os"
)

func main() {
    // 打开图片
    f, _ := os.Open("img.jpg")
    defer f.Close()
    img, _ := jpeg.Decode(f)

    // 旋转图片
    w := img.Bounds().Dy()
    h := img.Bounds().Dx()
    newImg := image.NewRGBA(image.Rect(0, 0, w, h))
    centerX := float64(w) / 2
    centerY := float64(h) / 2
    for y := 0; y < h; y++ {
        for x := 0; x < w; x++ {
            newX := int(math.Cos(math.Pi/2)*float64(x-int(centerX)) - math.Sin(math.Pi/2)*float64(y-int(centerY)) + centerX)
            newY := int(math.Sin(math.Pi/2)*float64(x-int(centerX)) + math.Cos(math.Pi/2)*float64(y-int(centerY)) + centerY)
            newImg.Set(newX, newY, img.At(x, y))
        }
    }

    // 保存图片
    f, _ = os.Create("rotate_img.jpg")
    defer f.Close()
    _ = jpeg.Encode(f, newImg, nil)
}

4. 压缩图片

有时候我们需要将图片压缩到一个较小的尺寸,这时可以使用image库中的Resample函数来实现。

package main

import (
    "image"
    "image/jpeg"
    "os"
)

func main() {
    // 打开图片
    f, _ := os.Open("img.jpg")
    defer f.Close()
    img, _ := jpeg.Decode(f)

    // 压缩图片
    w := img.Bounds().Dx() / 2
    h := img.Bounds().Dy() / 2
    newImg := image.NewRGBA(image.Rect(0, 0, w, h))
    draw.ApproxBiLinear.Scale(newImg, newImg.Bounds(), img, img.Bounds(), draw.Over, nil)

    // 保存图片
    f, _ = os.Create("compress.jpg")
    defer f.Close()
    _ = jpeg.Encode(f, newImg, nil)
}

5. 图片合并

使用Go语言的image库可以轻松合并多张图片到一张图片中。下面是一个简单的示例,将两张图片合并。

package main

import (
    "image"
    "image/jpeg"
    "os"
)

func main() {
    // 打开图片1
    f, _ := os.Open("img1.jpg")
    defer f.Close()
    img1, _ := jpeg.Decode(f)

    // 打开图片2
    f, _ = os.Open("img2.jpg")
    defer f.Close()
    img2, _ := jpeg.Decode(f)

    // 合并图片
    w := img1.Bounds().Dx() + img2.Bounds().Dx()
    h := img1.Bounds().Dy()
    newImg := image.NewRGBA(image.Rect(0, 0, w, h))
    for y := 0; y < h; y++ {
        for x := 0; x < w; x++ {
            if x < img1.Bounds().Dx() {
                newImg.Set(x, y, img1.At(x, y))
            } else {
                newImg.Set(x, y, img2.At(x-img1.Bounds().Dx(), y))
            }
        }
    }

    // 保存图片
    f, _ = os.Create("merge.jpg")
    defer f.Close()
    _ = jpeg.Encode(f, newImg, nil)
}

总结

Go语言的image库提供了很多方便的函数,可以快速实现图片处理的需求。本文介绍了一些常见的图片处理示例,希望对大家有所帮助。