【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 繪圖機制

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章