使用libpng从char缓冲区创建PNG并调整大小数据

时间:2013-03-08 22:07:06

标签: android c graphics libpng

我目前正在修改Android屏幕截图库以接受外部连接。当它连接Java时,我知道我可以获取原始数据并通过createBitmapFromBuffer(data)将其传递给Java的Bitmap。这里的最终目标是使用C,我无法弄清楚如何将像素数据流入libpng以使其正确写入。

有些观点: C服务器发送高度,宽度和bpp。然后它通过套接字发送从Android上的帧缓冲区转换的缓冲区数据。

客户端可以成功获取所有数据,我知道如何根据我拥有的数据生成标头。问题是将char []转换为png_set_rows和png_write_png将接受的内容,或者如何单独附加它并保存标题而不包含任何行数据。

2 个答案:

答案 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())。