私は、ラズベリーのdispmanxを使った簡単なグラフィックアプリケーションを開発中です。 私の目標は、stdin(RGBA配列から文字列としてフォーマットされたPythonアプリケーションから)からpngファイルを取得し、それを表示するためにdispmanxが期待するIMAGE_Tフォーマットに変換することです。文字列をIMAGE_Tに変換する
ここでは、ファイルからPNGを取得できる機能しかありませんが、ディスク上にイメージを書き込むのに時間がかかりすぎ、tmpfsのイベントが発生します。
文字列を入力として使用するには、この関数を書き換えるにはどうすればよいですか? ...私はこれだけを管理しなければなりませんが、私はpng_ptrとinfo_ptrを養うために、変数からファイルをエミュレートする方法がわからない
#include <png.h>
#include <stdlib.h>
#include "bcm_host.h"
#include "loadpng.h"
//-------------------------------------------------------------------------
#ifndef ALIGN_TO_16
#define ALIGN_TO_16(x) ((x + 15) & ~15)
#endif
//-------------------------------------------------------------------------
bool
loadPngData(
IMAGE_T* image,
const char *file)
{
FILE* fpin = fopen(file, "rb");
if (fpin == NULL)
{
fprintf(stderr, "loadpng: can't open file for reading\n");
return false;
}
//---------------------------------------------------------------------
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
NULL,
NULL,
NULL);
if (png_ptr == NULL)
{
fclose(fpin);
return false;
}
png_infop info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL)
{
png_destroy_read_struct(&png_ptr, 0, 0);
fclose(fpin);
return false;
}
if (setjmp(png_jmpbuf(png_ptr)))
{
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
fclose(fpin);
return false;
}
//---------------------------------------------------------------------
png_init_io(png_ptr, imgdata);
png_read_info(png_ptr, info_ptr);
//---------------------------------------------------------------------
png_byte colour_type = png_get_color_type(png_ptr, info_ptr);
png_byte bit_depth = png_get_bit_depth(png_ptr, info_ptr);
VC_IMAGE_TYPE_T type = VC_IMAGE_RGB888;
if (colour_type & PNG_COLOR_MASK_ALPHA)
{
type = VC_IMAGE_RGBA32;
}
initImage(image,
type,
png_get_image_width(png_ptr, info_ptr),
png_get_image_height(png_ptr, info_ptr),
false);
//---------------------------------------------------------------------
double gamma = 0.0;
if (png_get_gAMA(png_ptr, info_ptr, &gamma))
{
png_set_gamma(png_ptr, 2.2, gamma);
}
//---------------------------------------------------------------------
if (colour_type == PNG_COLOR_TYPE_PALETTE)
{
png_set_palette_to_rgb(png_ptr);
}
if ((colour_type == PNG_COLOR_TYPE_GRAY) && (bit_depth < 8))
{
png_set_expand_gray_1_2_4_to_8(png_ptr);
}
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
{
png_set_tRNS_to_alpha(png_ptr);
}
if (bit_depth == 16)
{
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
png_set_scale_16(png_ptr);
#else
png_set_strip_16(png_ptr);
#endif
}
if (colour_type == PNG_COLOR_TYPE_GRAY ||
colour_type == PNG_COLOR_TYPE_GRAY_ALPHA)
{
png_set_gray_to_rgb(png_ptr);
}
//---------------------------------------------------------------------
png_read_update_info(png_ptr, info_ptr);
//---------------------------------------------------------------------
png_bytepp row_pointers = malloc(image->height * sizeof(png_bytep));
png_uint_32 j = 0;
for (j = 0 ; j < image->height ; ++j)
{
row_pointers[j] = image->buffer + (j * image->pitch);
}
//---------------------------------------------------------------------
png_read_image(png_ptr, row_pointers);
//---------------------------------------------------------------------
fclose(fpin);
free(row_pointers);
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
return true;
}
編集:イメージは、生のRGBAでのpythonから提供することができますかpng形式で(ヘッダとチャンクを含む文字列として)。私は生のRGBAが速く(PNG形式をスキップする)、しかしこの機能を変更することは、PNG文字列でもっとシンプルになると思います... 手がかりは大歓迎です!
pythonアプリケーションの文字列には、pngファイルまたはRGBAデータのみが含まれていますか?後者の場合は、新しいRGBAデータごとに 'png_infop'構造体を手作業で設定する必要がありますが、おそらく、そこに置くべき値が何であるかは分かりません。また、RGBAデータではなく、圧縮されたPNGデータ – Rogus
問題のあいまいさに気付いたRogusに感謝します。 – technico