2013-03-08 22 views
1

我目前正在修改Android屏幕快照庫以接受外部連接。當它連接到Java時,我知道我可以通過createBitmapFromBuffer(data)將原始數據傳遞到Java的位圖中。這裏的最終目標是使用C,但我不知道如何將像素數據流行到libpng中以使其正確寫入。使用libpng從字符緩衝區和大小數據創建PNG

一些問題: C服務器發送高度,寬度和bpp。然後它通過套接字發送從Android上的幀緩衝區轉換來的緩衝區數據。

客戶端可以成功獲取所有數據,我知道如何從我擁有的數據生成標題。問題是採取一個char []並將其轉換爲png_set_rows和png_write_png將接受的內容,或者如何單獨附加它並保存標題而不包含任何行數據。

回答

1

lodepng看看。這是一個易於使用的libpng封裝,具有高級功能(如encode())。

1

讓我們來看看原型和描述png_set_rows

void png_set_rows(png_structp png_ptr, 
        png_infop info_ptr, 
        png_bytepp row_pointers); 

png_set_rows()就把圖象數據的行插入info_ptr 結構,其中row_pointers是一個指針到像素 陣列每行的數據。

我會假設你已經初始化png_stuctp傳遞作爲第一個參數,和你有一個空的png_infop您傳遞的第二個參數。

所以你的問題是作爲第三個參數傳遞什麼。

好吧,讓我們來看看定義png_byte:

typedef unsigned char png_byte;

大,一個png_byte是一個無符號的字符。

現在讓我們來看看定義爲png_bytepp:

typedef png_byte FAR * FAR * png_bytepp;

這是無符號的字符的二維數組。

所以,你所要做的就是創建無符號的字符的二維數組並將其轉換爲png_bytepp:

unsigned int IMAGE_HEIGHT = 720, IMAGE_WIDTH = 1280; 

unsigned char row_pointers[IMAGE_HEIGHT][IMAGE_WIDTH]; 

/* test image initialization */ 
unsigned int i, j; 
for (i = 0; i < IMAGE_HEIGHT; i++) { 
    for (j = 0; j < IMAGE_WIDTH; j++) { 
     row_pointers[i][j] = i * j; 
    } 
} 

png_set_rows(png_ptr, info_ptr, (png_bytepp)row_pointers);