Maison  >  Article  >  développement back-end  >  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
PHPzavant
2024-02-09 23:30:21333parcourir

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

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

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

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer