1

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

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

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

4

2 回答 2

2

让我们看一下原型和描述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 是指向每行像素数据的指针数组。

我将假设您已经初始化 apng_stuctp作为第一个参数传递,并且您有一个空png_infop的作为第二个参数传递。

所以你的问题是作为第三个参数传入什么。

好吧,让我们看一下 png_byte 的定义:

typedef unsigned char png_byte;

太好了, png_byte 是一个无符号字符。

现在让我们看一下 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);
于 2013-03-08T22:37:12.697 回答
1

Take a look at lodepng. It's an easy-to-use wrapper around libpng, with high-level functions (like encode()).

于 2013-03-08T22:38:23.977 回答