Heim  >  Artikel  >  Backend-Entwicklung  >  Konvertieren Sie ein RBGA-Bild effizient in ein RGB-Byte-Array

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

WBOY
WBOYnach vorne
2024-02-05 22:51:121089Durchsuche

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

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

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

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!

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