我目前正在修改Android屏幕截图库以接受外部连接。当它连接Java时,我知道我可以获取原始数据并通过createBitmapFromBuffer(data)将其传递给Java的Bitmap。这里的最终目标是使用C,我无法弄清楚如何将像素数据流入libpng以使其正确写入。
有些观点: C服务器发送高度,宽度和bpp。然后它通过套接字发送从Android上的帧缓冲区转换的缓冲区数据。
客户端可以成功获取所有数据,我知道如何根据我拥有的数据生成标头。问题是将char []转换为png_set_rows和png_write_png将接受的内容,或者如何单独附加它并保存标题而不包含任何行数据。
答案 0 :(得分: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是一个unsigned char。
现在让我们来看看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);
答案 1 :(得分:1)
看看lodepng。这是一个易于使用的libpng包装器,具有高级功能(如encode()
)。