Heim  >  Artikel  >  Backend-Entwicklung  >  Gibt es eine Bibliothek für Go, die palettenförmige PNGs mit 2-Bit-Farbtiefe öffnen kann?

Gibt es eine Bibliothek für Go, die palettenförmige PNGs mit 2-Bit-Farbtiefe öffnen kann?

PHPz
PHPznach vorne
2024-02-09 23:30:21333Durchsuche

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

php-Editor Xigua Go ist eine leistungsstarke Programmiersprache, aber gibt es eine Bibliothek, die Paletten-PNG mit 2-Bit-Farbtiefe öffnen kann? Die Antwort ist ja. Die Go-Sprache verfügt über zahlreiche Bibliotheken und Tools zum Arbeiten mit Bildern, von denen einige palettenförmige PNG-Bilder in bestimmten Tiefen öffnen und verarbeiten können. Mithilfe dieser Bibliotheken können Sie palettierte PNG-Bilder mit 2-Bit-Farbtiefe problemlos lesen und bearbeiten und so Ihren Anwendungen mehr Funktionalität und Flexibilität verleihen. Unabhängig davon, ob Sie Anfänger oder erfahrener Go-Entwickler sind, können diese Bibliotheken Ihnen dabei helfen, Ihre Ziele zu erreichen, indem sie bessere Bildverarbeitungs- und Bearbeitungsmöglichkeiten bieten.

Frageninhalt

Wie lese ich palettenbasierte PNG-Bilder mit go?

Für Bilder in Python kann ich einfach Folgendes tun:

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])

Verwenden Sie 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")
    }

Beim Dekodieren wird „png: ungültiges Format: keine PNG-Datei“ ausgegeben.

Wenn ich den Befehl file auf der Mac-Shell verwende, heißt es:

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

vscode rendert Bilder sehr gut.

Ich habe es sowohl an einem mit Adobe Illustrator erstellten Bild als auch an einem mit dem folgenden Code generierten Bild ausprobiert. Beide erhalten den gleichen Fehler:

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)
    }
}

Workaround

Es scheint, dass es in Ihrem Fall nicht am Format des Bildes liegt, sondern an der Art und Weise, wie Sie die Bilddatei verwenden.

Ich gehe davon aus, dass Sie es zuerst an image.DecodeConfig() (代码没有显示它,但 cfg 必须已初始化),然后传递给 image.Decode() weitergeben.

Das Problem besteht darin, dass Ihre Datei nach dem ersten Aufruf einen Offset hat, der zweite Aufruf jedoch davon ausgeht, dass sie vom Anfang der Datei liest.

Sie können dieses Problem lösen, indem Sie die Datei nach dem Lesen der Konfiguration zurücksetzen:

File.Seek(0, io.SeekStart)

Das obige ist der detaillierte Inhalt vonGibt es eine Bibliothek für Go, die palettenförmige PNGs mit 2-Bit-Farbtiefe öffnen kann?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen