Saya mempunyai perpustakaan c dan fungsi yang memerlukan penuding kepada tatasusunan bait yang mengandungi peta bit 24-bit dalam format rgb. Saluran alfa tidak penting dan boleh dipotong. Saya telah mencuba sesuatu seperti ini:
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())
Walau bagaimanapun, nrgba juga nampaknya dibina pada 4 bait setiap piksel. Saya boleh menyelesaikan masalah ini dengan menggunakan gocv, tetapi ini kelihatan seperti berlebihan untuk tugas yang begitu mudah. Adakah terdapat cara untuk melakukan ini secara berterusan dengan cara yang mudah dan cekap?
Tiada jenis imej rgb dalam perpustakaan standard, tetapi anda boleh memasang tatasusunan rgb dengan sangat mudah:
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
Data memegang nilai rgba 4-bait. Kod di atas hanya menyalin nilai rgb 3 bait pertama bagi semua piksel.
Lebih pantas kerana pix
数组中的行是连续的,因此可以通过每行仅调用 pixoffset
一次来改进上述代码,并且每个像素前进 4 个字节。另外,手动复制 3 个字节可能比调用 copy()
(garis dasar jika penting kepada anda):
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 } }
Atas ialah kandungan terperinci Tukar imej RBGA kepada tatasusunan bait RGB dengan cekap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!