我目前正在修改Android截图库以接受外部连接。当它连接到Java时,我知道我可以通过createBitmapFromBuffer(data)获得原始数据并将其传递到Java的位图。这里的最终目标是使用C,但我不知道如何将像素数据流行到libpng中以使其正确编写。
一些要点:C服务器发送高度、宽度和bpp。然后,它通过套接字发送从Android上的帧缓冲区转换过来的缓冲区数据。
客户端可以成功获取所有数据,我知道如何从我拥有的数据生成标题。问题是采取char[]并将其转换为png_set_rows和png_write_png将接受的东西,或者如何单独附加它并保存没有任何行数据的标题。
让我们看一下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是unsigned char。
现在让我们看一下png_bytepp:
的定义 typedef png_byte FAR * FAR * png_bytepp;
这是一个二维的无符号字符数组
所以,你所要做的就是创建一个2D的无符号字符数组并将其强制转换为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);
看看lodeping。它是一个易于使用的libpng包装器,具有高级函数(如encode()
)。