Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara pixelate dan meresap imej menggunakan Golang

Cara pixelate dan meresap imej menggunakan Golang

王林
王林asal
2023-08-21 09:25:531557semak imbas

Cara pixelate dan meresap imej menggunakan Golang

Cara menggunakan Golang untuk pixelate dan meresap imej

Ikhtisar:
Dalam bidang pemprosesan imej, pixelation dan resapan ialah dua teknik yang biasa digunakan untuk memproses kesan khas pada imej. Artikel ini akan memperkenalkan cara menggunakan bahasa Golang untuk melaksanakan pemprosesan pikselasi dan penyebaran imej serta memberikan contoh kod yang sepadan.

Pemprosesan peksel:
Pemprosesan ialah kesan yang mengurangkan butiran imej dan mewakilinya sebagai blok piksel Ia sering digunakan dalam pemprosesan imej untuk menjana kesan kartun atau mensimulasikan imej resolusi rendah. Berikut ialah contoh kod menggunakan Golang untuk melaksanakan pemprosesan pikselasi:

package main

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

func main() {
    // 读取原始图片
    file, err := os.Open("input.jpg")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

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

    // 像素化处理
    bounds := img.Bounds()
    dx := bounds.Dx()
    dy := bounds.Dy()

    // 设置像素块大小
    blockSize := 10

    // 新建一张与原图相同大小的画布
    pixImg := image.NewRGBA(bounds)

    // 对每个像素块进行处理
    for x := 0; x < dx; x += blockSize {
        for y := 0; y < dy; y += blockSize {
            // 获取像素块的平均颜色值
            sumR, sumG, sumB := 0, 0, 0
            count := 0
            for i := x; i < x+blockSize && i < dx; i++ {
                for j := y; j < y+blockSize && j < dy; j++ {
                    r, g, b, _ := img.At(i, j).RGBA()
                    sumR += int(r >> 8)
                    sumG += int(g >> 8)
                    sumB += int(b >> 8)
                    count++
                }
            }
            avgR := uint8(sumR / count)
            avgG := uint8(sumG / count)
            avgB := uint8(sumB / count)

            // 将像素块填充为平均颜色
            for i := x; i < x+blockSize && i < dx; i++ {
                for j := y; j < y+blockSize && j < dy; j++ {
                    pixImg.Set(i, j, color.RGBA{avgR, avgG, avgB, 255})
                }
            }
        }
    }

    // 保存处理后的图片
    outFile, err := os.Create("output_pixelize.jpg")
    if err != nil {
        log.Fatal(err)
    }
    defer outFile.Close()

    jpeg.Encode(outFile, pixImg, nil)

    log.Println("Pixelization completed!")
}

Pemprosesan resapan:
Resapan ialah kesan yang memindahkan nilai piksel ke piksel sekeliling dan boleh digunakan dalam pemprosesan imej untuk menjana kesan mozek atau kabur. Berikut ialah contoh kod menggunakan Golang untuk melaksanakan pemprosesan resapan:

package main

import (
    "image"
    "image/color"
    "image/jpeg"
    "log"
    "math/rand"
    "os"
)

func main() {
    // 读取原始图片
    file, err := os.Open("input.jpg")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

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

    // 扩散处理
    bounds := img.Bounds()
    dx := bounds.Dx()
    dy := bounds.Dy()

    // 扩散半径
    radius := 5

    // 新建一张与原图相同大小的画布
    diffuseImg := image.NewRGBA(bounds)

    // 对每个像素进行扩散处理
    for x := 0; x < dx; x++ {
        for y := 0; y < dy; y++ {
            // 获取当前像素的颜色
            r, g, b, a := img.At(x, y).RGBA()
            curColor := color.RGBA{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)}

            // 随机选择周围像素进行扩散
            for i := -radius; i <= radius; i++ {
                for j := -radius; j <= radius; j++ {
                    // 避免处理超出图片范围的像素
                    if x+i >= 0 && x+i < dx && y+j >= 0 && y+j < dy {
                        // 获取周围像素的颜色
                        neighborColor := img.At(x+i, y+j)

                        // 将颜色传递给当前像素
                        if rand.Intn(radius*2) == 0 {
                            curColor = neighborColor
                        }
                    }
                }
            }

            // 将扩散后的像素填充到画布上
            diffuseImg.Set(x, y, curColor)
        }
    }

    // 保存处理后的图片
    outFile, err := os.Create("output_diffuse.jpg")
    if err != nil {
        log.Fatal(err)
    }
    defer outFile.Close()

    jpeg.Encode(outFile, diffuseImg, nil)

    log.Println("Diffusion completed!")
}

Ringkasan:
Artikel ini memperkenalkan cara menggunakan Golang untuk mengpiksel dan meresap imej, serta menyediakan contoh kod yang sepadan. Dengan mempelajari dan menguasai kedua-dua teknik pemprosesan imej ini, kami boleh melaksanakan pelbagai kesan khas yang menarik dalam program dan menambahkan lagi kesan artistik pada gambar. Saya berharap artikel ini dapat membantu pembaca dalam pembelajaran dan amalan pemprosesan imej mereka.

Atas ialah kandungan terperinci Cara pixelate dan meresap imej menggunakan Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn