Maison > développement back-end > Golang > Existe-t-il une bibliothèque pour Go qui peut ouvrir des png en palette avec une profondeur de couleur de 2 bits ?

Existe-t-il une bibliothèque pour Go qui peut ouvrir des png en palette avec une profondeur de couleur de 2 bits ?

PHPz
Libérer: 2024-02-09 23:30:21
avant
369 Les gens l'ont consulté

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

Éditeur PHP Xigua Go est un langage de programmation puissant, mais existe-t-il une bibliothèque capable d'ouvrir la palette PNG avec une profondeur de couleur de 2 bits ? La réponse est oui. Le langage Go dispose de nombreuses bibliothèques et outils pour travailler avec des images, dont certains peuvent ouvrir et traiter des images PNG en palette à des profondeurs spécifiques. En utilisant ces bibliothèques, vous pouvez facilement lire et modifier des images PNG en palette avec une profondeur de couleur de 2 bits, ajoutant ainsi plus de fonctionnalités et de flexibilité à vos applications. Que vous soyez un développeur Go débutant ou expérimenté, ces bibliothèques peuvent vous aider à atteindre vos objectifs, en offrant de meilleures capacités de traitement et d'édition d'images.

Contenu de la question

Comment lire des images png basées sur une palette à l'aide de go ?

Pour les images en python, je peux simplement faire ce qui suit :

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])
Copier après la connexion

Utilisez 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")
    }
Copier après la connexion

Il affichera "png : format invalide : pas un fichier png" lors du décodage.

Si j'utilise la commande file sur le shell Mac, cela dit :

image.png: png image data, 100 x 100, 2-bit colormap, non-interlaced
Copier après la connexion

vscode rend très bien les images.

Je l'ai essayé à la fois sur une image créée par Adobe Illustrator et sur une image générée par le code suivant. Les deux obtiennent la même erreur :

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)
    }
}
Copier après la connexion

Solution de contournement

Il semble que dans votre cas, ce n'est pas le format de l'image mais la façon dont vous utilisez le fichier image.

Je suppose que vous le transmettez d'abord à image.DecodeConfig() (代码没有显示它,但 cfg 必须已初始化),然后传递给 image.Decode().

Le problème est qu'après le premier appel, votre fichier a un décalage, mais le deuxième appel suppose qu'il lit depuis le début du fichier.

Vous pouvez résoudre ce problème en annulant le fichier après avoir lu la configuration :

Fichier.Seek(0, io.SeekStart)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal