Android 使用libpng从char缓冲区和大小数据创建PNG

Android 使用libpng从char缓冲区和大小数据创建PNG,android,c,graphics,libpng,Android,C,Graphics,Libpng,我目前正在修改Android屏幕截图库以接受外部连接。当它为Java连接时,我知道我可以获取原始数据,并通过createBitmapFromBuffer(数据)将其传递到Java的位图中。这里的最终目标是使用C语言,但我不知道如何将像素数据流行到libpng中以使其正确写入 有几点: C服务器发送高度、宽度和bpp。然后,它通过套接字发送从Android上的帧缓冲区转换而来的缓冲区数据 客户机可以成功地获取所有数据,我知道如何从我拥有的数据生成标题。问题是获取一个char[]并将其转换为png\

我目前正在修改Android屏幕截图库以接受外部连接。当它为Java连接时,我知道我可以获取原始数据,并通过createBitmapFromBuffer(数据)将其传递到Java的位图中。这里的最终目标是使用C语言,但我不知道如何将像素数据流行到libpng中以使其正确写入

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


客户机可以成功地获取所有数据,我知道如何从我拥有的数据生成标题。问题是获取一个char[]并将其转换为png\u set\u rows和png\u write\u png可以接受的内容,或者如何单独附加它并保存没有任何行数据的标题。

让我们看看
png\u set\u rows的原型和描述。

void png_set_rows(png_structp png_ptr, 
                  png_infop info_ptr, 
                  png_bytepp row_pointers);
png_set_rows()应将图像数据的行放入info_ptr中 结构,其中row_指针是指向像素的指针数组 每行的数据

我假设您已经初始化了一个
png\u stuctp
作为第一个参数传递,并且有一个空的
png\u infop
作为第二个参数传递

所以你的问题是,第三个论点是什么

,让我们看看PNG*Byth:< /P>的定义。

typedef无符号字符png_字节

很好,png_字节是无符号字符

现在让我们来看看PNGYBYTEPP:< /P>的定义。

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);
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);
无符号整数图像高度=720,图像宽度=1280;
无符号字符行指针[图像高度][图像宽度];
/*测试图像初始化*/
无符号整数i,j;
对于(i=0;i
看一看。它是一个围绕libpng的易于使用的包装器,具有高级函数(如
encode()