【Android】从SurfaceFlinger中获取各layer图片(3)总结回顾

https://blog.csdn.net/aaajj/article/details/93653074

https://blog.csdn.net/aaajj/article/details/102537628

里面讨论了从SurfaceFlinger中获取layer图像的一个试验,这里再回顾下,

应用的图像本质上是画在一个内存空间上,这个内存区是由SurfaceFinger创建的,通过一系列复杂的操作,客户端可以获取到这个共享区域的地址,在上面进行写数据来实现绘图。

【Android显示系统初探】surface初相识

里面的C++程序通过写内存数据来画图,可以加深这个理解。

SurfaceFinger创建的图像存储区通过GraifcBuffer进行了管理,在我们的试验中,也是获取到了GraifcBuffer对象,并通过binder的方式,把GraifcBuffer对象传送给另外的一个程序A,程序A获取到GraphicBuffer对象后,调用其lockAsync方法获取到图像的地址,然后获取到图像,保存到图片里。

                        sp<GraphicBuffer> buf = new GraphicBuffer();;

                        data.read(*buf);

                       

                        Region newDirtyRegion;

                        const Rect bounds(w, h);

                        newDirtyRegion.set(bounds);

                       

                        int fenceFd = -1;

                        void* vaddr;

                        //GRALLOC_USAGE_SW_READ_OFTEN 0x00000003U

                        //GRALLOC_USAGE_SW_WRITE_OFTEN 0x00000030U

        status_t res = buf->lockAsync(0x00000003U | 0x00000030U,

                newDirtyRegion.bounds(), &vaddr, fenceFd);

               

              printf("==== vaddr=%p\n", vaddr);

             

              char pname[32] = {0};

                        sprintf(pname, "%02d.png", icode++);

                       

                        char* base = (char*)vaddr;

                       

                        writePNG(pname, base, w, h, format, s);

 

 

参考资料

https://www.jianshu.com/p/993e66015c18

Android 绘图机制

 

猜你喜欢

转载自blog.csdn.net/aaajj/article/details/105159905