Konvertieren Sie ein RBGA-Bild effizient in ein RGB-Byte-Array

WBOY
Freigeben: 2024-02-05 22:51:12
nach vorne
1093 Leute haben es durchsucht

Konvertieren Sie ein RBGA-Bild effizient in ein RGB-Byte-Array

Inhalt der Frage

Ich habe eine C-Bibliothek und eine Funktion, die einen Zeiger auf ein Byte-Array erfordert, das eine 24-Bit-Bitmap im RGB-Format enthält. Der Alphakanal ist nicht wichtig und kann gekürzt werden. Ich habe so etwas versucht:

func load(filePath string) *image.RGBA {
    imgFile, err := os.Open(filePath)
    if err != nil {
        fmt.Printf("Cannot read file %v\n", err)
    }
    defer imgFile.Close()

    img, _, err := image.Decode(imgFile)
    if err != nil {
        fmt.Printf("Cannot decode file %v\n", err)
    }
    return img.(*image.RGBA)
}

    img := load("myimg.png")

    bounds := img.Bounds()
    width, height := bounds.Max.X, bounds.Max.Y

    // Convert to RGB? Probably not...
    newImg := image.NewNRGBA(image.Rect(0, 0, width, height))
    draw.Draw(newImg, newImg.Bounds(), img, bounds.Min, draw.Src)
    // Pass image pointer to C function.
    C.PaintOnImage(unsafe.Pointer(&newImg.Pix[0]), C.int(newImg.Bounds().Dy()), C.int(newImg.Bounds().Dx())
Nach dem Login kopieren

Nrgba scheint jedoch auch auf 4 Bytes pro Pixel aufgebaut zu sein. Ich könnte dieses Problem mit gocv lösen, aber das scheint für eine so einfache Aufgabe übertrieben zu sein. Gibt es eine Möglichkeit, dies auf einfache und effiziente Weise zu tun?


Richtige Antwort


In der Standardbibliothek gibt es keinen RGB-Bildtyp, aber Sie können ganz einfach ein RGB-Array zusammenstellen:

bounds := img.bounds()
rgb := make([]byte, bounds.dx()*bounds.dy()*3)
idx := 0
for y := bounds.min.y; y < bounds.max.y; y++ {
    for x := bounds.min.x; x < bounds.max.x; x++ {
        offs := img.pixoffset(x, y)
        copy(rgb[idx:], img.pix[offs:offs+3])
        idx += 3
    }
}
Nach dem Login kopieren

img.pix Daten enthalten 4-Byte-RGBA-Werte. Der obige Code kopiert lediglich die ersten 3 Byte RGB-Wert aller Pixel.

Schneller durch pix 数组中的行是连续的,因此可以通过每行仅调用 pixoffset 一次来改进上述代码,并且每个像素前进 4 个字节。另外,手动复制 3 个字节可能比调用 copy() (Grundlinie, falls für Sie wichtig):

bounds := img.Bounds()
rgb := make([]byte, bounds.Dx()*bounds.Dy()*3)
idx := 0

for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
    offs := img.PixOffset(bounds.Min.X, y)
    for x := bounds.Min.X; x < bounds.Max.X; x++ {
        rgb[idx+0] = img.Pix[offs+0]
        rgb[idx+1] = img.Pix[offs+1]
        rgb[idx+2] = img.Pix[offs+2]
        idx += 3
        offs += 4
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonKonvertieren Sie ein RBGA-Bild effizient in ein RGB-Byte-Array. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage