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は、各行のピクセルデータへのポインターの配列です。

最初の引数として渡すためにすでにaを初期化していて、2番目の引数として渡すpng_stuctp空があると仮定します。png_infop

したがって、あなたの質問は、3番目の引数として何を渡すかです。

さて、png_byteの定義を見てみましょう:

typedef unsigned char png_byte;

素晴らしい、png_byteはunsignedcharです。

次に、png_byteppの定義を見てみましょう。

typedef png_byte FAR * FAR * png_bytepp;

これは、unsignedcharの2次元配列です。

したがって、必要なのは、符号なし文字の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

lodepngを見てください。これは、libpng の使いやすいラッパーであり、高レベルの関数 ( などencode()) を備えています。

于 2013-03-08T22:38:23.977 に答える