Heim >Backend-Entwicklung >Golang >Gibt es eine Bibliothek für Go, die palettenförmige PNGs mit 2-Bit-Farbtiefe öffnen kann?
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.
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) } }
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!