Cara memproses gambar dalam golang

WBOY
Lepaskan: 2023-05-15 10:05:37
asal
1886 orang telah melayarinya

Dengan perkembangan pesat Internet, pemprosesan imej telah menjadi bahagian yang tidak dapat dielakkan dalam pembangunan web, dan Golang tidak terkecuali. Golang sudah mempunyai set alat yang sangat kaya untuk pemprosesan imej, seperti pakej imej dalam pustaka standard, goimage, imagick, dll. dalam pustaka pihak ketiga.

Artikel ini akan memperkenalkan secara terperinci kaedah dan teknik pemprosesan imej Golang untuk membantu pembaca memahami cara memproses imej di Golang.

1. Gunakan pakej imej dalam pustaka standard Golang

Pakej imej ialah pustaka operasi imej standard yang disediakan di Golang. Ia digunakan terutamanya untuk memproses format fail imej biasa, seperti PNG , JPEG, Format seperti BMP dan GIF. Ia menyediakan satu set antara muka dan fungsi asas yang boleh melaksanakan fungsi seperti penyahkodan, pengekodan, pemangkasan, penskalaan, putaran dan transformasi fail imej.

Mari kita lihat cara melaksanakan fungsi penskalaan imej berdasarkan pakej imej:

package main

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

func main() {
    // 读取源图片文件
    file, err := os.Open("source.jpg")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // 解码源图片文件
    img, _, err := image.Decode(file)
    if err != nil {
        panic(err)
    }

    // 计算新图片尺寸
    newWidth := 640
    newHeight := (newWidth * int(img.Bounds().Dy())) / int(img.Bounds().Dx())

    // 缩放图片
    resized := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight))
    if err := resize(resized, img); err != nil {
        panic(err)
    }

    // 保存新图片文件
    newFile, err := os.Create("resized.jpg")
    if err != nil {
        panic(err)
    }
    defer newFile.Close()

    // 编码新图片
    if err := jpeg.Encode(newFile, resized, &jpeg.Options{Quality: 80}); err != nil {
        panic(err)
    }
}

// 缩放图片函数
func resize(dst *image.RGBA, src image.Image) error {
    sw, sh := src.Bounds().Dx(), src.Bounds().Dy()
    dw, dh := dst.Bounds().Dx(), dst.Bounds().Dy()
    scaleW, scaleH := float64(sw)/float64(dw), float64(sh)/float64(dh)
    if scaleW > scaleH {
        scaleH = scaleW
    } else {
        scaleW = scaleH
    }
    w, h := int(float64(sw)/scaleW), int(float64(sh)/scaleH)
    tmp := image.NewRGBA(image.Rect(0, 0, w, h))
    for y := 0; y < h; y++ {
        for x := 0; x < w; x++ {
            tmp.Set(x, y, src.At(int(float64(x)*scaleW), int(float64(y)*scaleH)))
        }
    }
    return resize2(dst, tmp)
}

// 缩放图片函数
func resize2(dst *image.RGBA, src image.Image) error {
    sw, sh := src.Bounds().Dx(), src.Bounds().Dy()
    dw, dh := dst.Bounds().Dx(), dst.Bounds().Dy()
    scaleW, scaleH := float64(sw)/float64(dw), float64(sh)/float64(dh)
    if scaleW > scaleH {
        scaleH = scaleW
    } else {
        scaleW = scaleH
    }
    for y := 0; y < dh; y++ {
        for x := 0; x < dw; x++ {
            dst.Set(x, y, src.At(int(float64(x)*scaleW), int(float64(y)*scaleH)))
        }
    }
    return nil
}
Salin selepas log masuk

Kod ini mula-mula membaca fail imej bernama source.jpg, dan kemudian memanggil imej.Nyahkod () fungsi menyahkod fail imej menjadi imej. Objek imej dalam Golang kemudian mengira saiz imej baharu, menggunakan nisbah aspek imej asal dalam proses pengiraan untuk memastikan saiz imej berskala tidak akan diherotkan; , simpan imej berskala sebagai fail baharu bernama resized.jpg dengan memanggil fungsi jpeg.Encode().

2. Gunakan pustaka pihak ketiga goimage

goimage ialah pustaka pemprosesan imej yang berkuasa di Golang Ia menyediakan pelbagai fungsi dan antara muka yang boleh melaksanakan pelbagai operasi pemprosesan imej, seperti zum . , putar, pangkas, penapis, dsb. Dan fungsinya tidak berhenti di situ Ia juga menyediakan beberapa operasi yang lebih kompleks, seperti jahitan gambar, potongan, sintesis HDR, dsb.

Mari tunjukkan kepada anda cara melaksanakan operasi penskalaan imej berdasarkan goimage:

package main

import (
    "github.com/disintegration/imaging"
    "image/jpeg"
    "os"
)

func main() {
    // 读取源图片文件
    file, err := os.Open("source.jpg")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // 解码源图片文件
    img, err := jpeg.Decode(file)
    if err != nil {
        panic(err)
    }

    // 缩放图片
    resized := imaging.Resize(img, 640, 0, imaging.Lanczos)

    // 保存新图片文件
    newFile, err := os.Create("resized.jpg")
    if err != nil {
        panic(err)
    }
    defer newFile.Close()

    // 编码新图片
    if err := jpeg.Encode(newFile, resized, &jpeg.Options{Quality: 80}); err != nil {
        panic(err)
    }
}
Salin selepas log masuk

Kod ini juga melaksanakan fungsi penskalaan imej, tetapi menggunakan pengimejan.Resize() dalam fungsi perpustakaan goimage dan bukannya melaksanakan sendiri algoritma penskalaan secara manual. Ini mengurangkan beban pembangun pada tahap tertentu, di samping memastikan kualiti dan kestabilan imej.

3 Gunakan perpustakaan pihak ketiga imagick

Selain pakej imej dan pustaka pihak ketiga goimage dalam perpustakaan standard, anda juga boleh menggunakan perpustakaan imagick untuk melaksanakan pemprosesan imej dalam Golang. Imagick ialah versi ImageMagick terikat Golang, yang menyediakan keupayaan pemprosesan imej asas dan fungsi manipulasi imej lanjutan.

Mari kita tunjukkan cara menggunakan perpustakaan imagick untuk melaksanakan fungsi penskalaan imej:

package main

import (
    "github.com/gographics/imagick/imagick"
    "io/ioutil"
    "os"
)

func main() {
    // 初始化imagick库
    err := imagick.Initialize()
    if err != nil {
        panic(err)
    }
    defer imagick.Terminate()

    // 读取源图片文件
    file, err := os.Open("source.jpg")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // 解码源图片文件
    buffer, err := ioutil.ReadAll(file)
    if err != nil {
        panic(err)
    }
    wand := imagick.NewMagickWand()
    if err := wand.ReadImageBlob(buffer); err != nil {
        panic(err)
    }

    // 缩放图片
    if err := wand.ResizeImage(640, 0, imagick.FILTER_LANCZOS, 1); err != nil {
        panic(err)
    }

    // 保存新图片文件
    if err := wand.WriteImageFile(imagick.NewMagickWand().NewCollection(), "resized.jpg"); err != nil {
        panic(err)
    }
}
Salin selepas log masuk

Kod ini melaksanakan pengamulaan perpustakaan imagick dan operasi penskalaan imej Proses pelaksanaan khusus adalah sama seperti dua yang sebelumnya Contoh-contohnya hampir sama. Walau bagaimanapun, perlu diingatkan bahawa antara muka perpustakaan imagick mungkin berbeza daripada beberapa tabiat biasa menggunakan Golang, jadi perhatian khusus diperlukan. Pada masa yang sama, perpustakaan imagick juga menyediakan antara muka operasi imej yang kaya, yang boleh digunakan oleh pembangun mengikut keperluan sebenar.

Ringkasnya, artikel ini menerangkan terutamanya beberapa kaedah pemprosesan imej di Golang: menggunakan pakej imej dalam pustaka standard, menggunakan pustaka pihak ketiga goimage dan menggunakan pustaka pihak ketiga imagick. Apabila perpustakaan pihak ketiga tidak boleh digunakan, adalah disyorkan untuk menggunakan pakej imej dalam perpustakaan standard. Untuk operasi imej yang lebih kaya dan kompleks, anda boleh menggunakan dua perpustakaan goimage atau imagick. Akhir kata, saya amat berharap agar pembaca dapat memilih kaedah pemprosesan imej yang sesuai mengikut situasi sebenar mereka.

Atas ialah kandungan terperinci Cara memproses gambar dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!