Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah terdapat perpustakaan untuk Go yang boleh membuka png palet dengan kedalaman warna 2-bit?

Adakah terdapat perpustakaan untuk Go yang boleh membuka png palet dengan kedalaman warna 2-bit?

PHPz
PHPzke hadapan
2024-02-09 23:30:21331semak imbas

Go 是否有可以打开 2 位颜色深度的调色板 png 的库?

editor php Xigua Go ialah bahasa pengaturcaraan yang berkuasa, tetapi adakah terdapat perpustakaan yang boleh membuka palet PNG dengan kedalaman warna 2-bit? Jawapannya ya. Bahasa Go mempunyai banyak perpustakaan dan alatan untuk bekerja dengan imej, sebahagian daripadanya boleh membuka dan memproses imej PNG berpalet pada kedalaman tertentu. Dengan menggunakan perpustakaan ini, anda boleh membaca dan mengedit imej PNG berpalet dengan kedalaman warna 2-bit dengan mudah, menambah lebih banyak fungsi dan fleksibiliti pada aplikasi anda. Sama ada anda seorang pemula atau pembangun Go yang berpengalaman, perpustakaan ini boleh membantu anda mencapai matlamat anda, menyediakan pemprosesan imej dan keupayaan menyunting yang lebih baik.

Kandungan soalan

Bagaimana untuk membaca imej png berasaskan palet menggunakan go?

Untuk imej dalam python, saya boleh melakukan perkara berikut:

from pil import image

im = image.open('image.png')
pix = im.load()
for i in range(100):
    for j in range(100):
        print(pix[i, j])

Gunakan go:

f, err := os.open("image.png")
    if err != nil {
        log.fatal(err)
    }
    defer f.close()

    pal, ok := cfg.colormodel.(color.palette) // ok is true
    if ok {
        for i := range pal {
            cr, cg, cb, ca := pal[i].rgba()
            fmt.printf("pal[%3d] = %5d,%5d,%5d,%5d\n", i, cr, cg, cb, ca)
        }
    }

    img, err := png.decode(f)
    if err != nil {
        log.fatal(err) // fails here!!
    }

    for y := img.bounds().min.y; y < img.bounds().max.y; y++ {
        for x := img.bounds().min.x; x < img.bounds().max.x; x++ {
            log.println("img.at(x, y):", img.at(x, y))
        }
        fmt.print("\n")
    }

Ia akan membuang "png: format tidak sah: bukan fail png" apabila menyahkod.

Jika saya menggunakan arahan file pada mac shell, ia berkata:

image.png: png image data, 100 x 100, 2-bit colormap, non-interlaced

vscode memaparkan imej dengan sangat baik.

Saya mencubanya pada kedua-dua imej yang dicipta oleh Adobe Illustrator dan imej yang dihasilkan oleh kod berikut. Kedua-duanya mendapat ralat yang sama:

func createPNG() {
    // Create a new image with the desired dimensions
    img := image.NewPaletted(image.Rect(0, 0, 100, 100), color.Palette{
        color.RGBA{255, 0, 0, 255}, // Red
        color.RGBA{0, 255, 0, 255}, // Green
        color.RGBA{0, 0, 255, 255}, // Blue
    })

    // Set the pixel colors in the image
    for x := 0; x < 100; x++ {
        for y := 0; y < 100; y++ {
            switch {
            case x < 50 && y < 50:
                img.SetColorIndex(x, y, 0) // Set the pixel at (x, y) to red
            case x >= 50 && y < 50:
                img.SetColorIndex(x, y, 1) // Set the pixel at (x, y) to green
            case x < 50 && y >= 50:
                img.SetColorIndex(x, y, 2) // Set the pixel at (x, y) to blue
            default:
                img.SetColorIndex(x, y, 3) // Set the pixel at (x, y) to transparent
            }
        }
    }

    // Create a new file to save the PNG image
    file, err := os.Create("image.png")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // Encode the image as a PNG and save it to the file
    err = png.Encode(file, img)
    if err != nil {
        panic(err)
    }
}

Penyelesaian

Nampaknya dalam kes anda ini bukan format imej tetapi cara anda menggunakan fail imej.

Saya menganggap anda menyampaikannya kepada image.DecodeConfig() (代码没有显示它,但 cfg 必须已初始化),然后传递给 image.Decode() dahulu.

Masalahnya ialah selepas panggilan pertama, fail anda mengalami offset, tetapi panggilan kedua menganggap ia membaca dari permulaan fail.

Anda boleh menyelesaikan masalah ini dengan menggulung semula fail selepas membaca konfigurasi:

File.Seek(0, io.SeekStart)

Atas ialah kandungan terperinci Adakah terdapat perpustakaan untuk Go yang boleh membuka png palet dengan kedalaman warna 2-bit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam