使用libpng从字符缓冲区和大小数据创建PNG



我目前正在修改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())。

最新更新