1

libpng を使用して png ファイルを生成しました。RGB png の場合は問題ありません。しかし、pngに透明なプロパティを与えたいです。

いくつかのコードを参照し、* を使用する場所をフラグ付きに追加します

*行++ = 230; *PNG_COLOR_TYPE_RGBA,*

透明なプロパティを持たせるために、コードは正常に実行されますが、透明な効果は見られませんでした。

libpng または png の操作に精通している人は誰でも助けてくれますか?

このコードでは、pixel_t、& bitmap_t は RGB データを含むデータです。

/* A colored pixel. */
typedef struct {
    uint8_t red;
    uint8_t green;
    uint8_t blue;
} pixel_t;


/* A picture. */
typedef struct  {
    pixel_t *pixels;
    size_t width;
    size_t height;
} bitmap_t;


static int save_png_to_file (bitmap_t *bitmap, const char *path)
{
    FILE * fp;
    png_structp png_ptr = NULL;
    png_infop info_ptr = NULL;
    size_t x, y;
    png_byte ** row_pointers = NULL;
    /* "status" contains the return value of this function. At first
       it is set to a value which means 'failure'. When the routine
       has finished its work, it is set to a value which means
       'success'. */
    int status = -1;
    /* The following number is set by trial and error only. I cannot
       see where it it is documented in the libpng manual.
    */
    int pixel_size = 3;
    int depth = 8;

    fp = fopen (path, "wb");
    if (! fp) {
        goto fopen_failed;
    }

    png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    if (png_ptr == NULL) {
        goto png_create_write_struct_failed;
    }

    info_ptr = png_create_info_struct (png_ptr);
    if (info_ptr == NULL) {
        goto png_create_info_struct_failed;
    }


   // png_set_invert_alpha(png_ptr);



    /* Set up error handling. */

    if (setjmp (png_jmpbuf (png_ptr))) {
        goto png_failure;
    }

    /* Set image attributes. */


    png_set_IHDR (png_ptr,
                  info_ptr,
                  bitmap->width,
                  bitmap->height,
                  depth,
                  *PNG_COLOR_TYPE_RGBA,*
                  PNG_INTERLACE_NONE,
                  PNG_COMPRESSION_TYPE_DEFAULT,
                  PNG_FILTER_TYPE_DEFAULT);

    /* Initialize rows of PNG. */
    //(png_byte **) added by li
    row_pointers = (png_byte **)png_malloc (png_ptr, bitmap->height * sizeof (png_byte *));

    for (y = 0; y < bitmap->height; ++y) {
        //png_byte * added by li
//         png_byte *row = (png_byte *)
//             png_malloc (png_ptr, sizeof (uint8_t) * bitmap->width * pixel_size);
        png_byte *row = (png_byte *)
            png_malloc (png_ptr, sizeof (uint8_t) * bitmap->width * 4);


        row_pointers[y] = row;
        for (x = 0; x < bitmap->width; ++x) {
            pixel_t * pixel = pixel_at (bitmap, x, y);
            *row++ = pixel->red;
            *row++ = pixel->green;
            *row++ = pixel->blue;
            **row++ = 230;*

        }
    }

    /* Write the image data to "fp". */

    png_init_io (png_ptr, fp);
    png_set_rows (png_ptr, info_ptr, row_pointers);
    png_write_png (png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);

    /* The routine has successfully written the file, so we set
       "status" to a value which indicates success. */

    status = 0;

    for (y = 0; y < bitmap->height; y++) {
        png_free (png_ptr, row_pointers[y]);
    }
    png_free (png_ptr, row_pointers);

 png_failure:
 png_create_info_struct_failed:
    png_destroy_write_struct (&png_ptr, &info_ptr);
 png_create_write_struct_failed:
    fclose (fp);
 fopen_failed:
    return status;
}
4

2 に答える 2

1

bitdepth=8 の alpha を持つトゥルーカラー PNG 画像は、透明度を追加チャンネルとして RGBA 順で 0 から 255 の範囲 (0=完全に透明; 255=完全に不透明) で格納します。

あなたがしていることは私には正しいように見えます。230 という値は「ほぼ不透明」を意味するだけで、透明度を視覚的に検出するのは難しい場合があります。他の値で試してください。

ところで、PNG 画像に透明度を追加する方法は他にもあることに注意してください。こちらの回答を参照してください。

于 2012-12-17T11:28:27.350 に答える