Tukar imej RBGA kepada tatasusunan bait RGB dengan cekap

WBOY
Lepaskan: 2024-02-05 22:51:12
ke hadapan
1094 orang telah melayarinya

Tukar imej RBGA kepada tatasusunan bait RGB dengan cekap

Kandungan soalan

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())
Salin selepas log masuk

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?


Jawapan betul


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
    }
}
Salin selepas log masuk

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
    }
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan