La façon de coder les PNG en mémoire tampon à l'aide libpng?

Je suis actuellement à l'aide de la suite à écrire un PNG dans un fichier:

#include <png.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
/* Pixels in this bitmap structure are stored as BGR. */
typedef struct _RGBPixel {
uint8_t blue;
uint8_t green;
uint8_t red;
} RGBPixel;
/* Structure for containing decompressed bitmaps. */
typedef struct _RGBBitmap {
RGBPixel *pixels;
size_t width;
size_t height;
size_t bytewidth;
uint8_t bytes_per_pixel;
} RGBBitmap;
/* Returns pixel of bitmap at given point. */
#define RGBPixelAtPoint(image, x, y) \
*(((image)->pixels) + (((image)->bytewidth * (y)) \
+ ((x) * (image)->bytes_per_pixel)))
/* Attempts to save PNG to file; returns 0 on success, non-zero on error. */
int save_png_to_file(RGBBitmap *bitmap, const char *path)
{
FILE *fp = fopen(path, "wb");
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
size_t x, y;
png_uint_32 bytes_per_row;
png_byte **row_pointers = NULL;
if (fp == NULL) return -1;
/* Initialize the write struct. */
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
fclose(fp);
return -1;
}
/* Initialize the info struct. */
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
png_destroy_write_struct(&png_ptr, NULL);
fclose(fp);
return -1;
}
/* Set up error handling. */
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
return -1;
}
/* Set image attributes. */
png_set_IHDR(png_ptr,
info_ptr,
bitmap->width,
bitmap->height,
8,
PNG_COLOR_TYPE_RGB,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_DEFAULT,
PNG_FILTER_TYPE_DEFAULT);
/* Initialize rows of PNG. */
bytes_per_row = bitmap->width * bitmap->bytes_per_pixel;
row_pointers = png_malloc(png_ptr, bitmap->height * sizeof(png_byte *));
for (y = 0; y < bitmap->height; ++y) {
uint8_t *row = png_malloc(png_ptr, sizeof(uint8_t) * bitmap->bytes_per_pixel);
row_pointers[y] = (png_byte *)row;
for (x = 0; x < bitmap->width; ++x) {
RGBPixel color = RGBPixelAtPoint(bitmap, x, y);
*row++ = color.red;
*row++ = color.green;
*row++ = color.blue;
}
}
/* Actually write the image data. */
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);
/* Cleanup. */
for (y = 0; y < bitmap->height; y++) {
png_free(png_ptr, row_pointers[y]);
}
png_free(png_ptr, row_pointers);
/* Finish writing. */
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
return 0;
}

Comment puis-je écrire une fonction similaire (en C) pour encoder au format PNG à une mémoire tampon?

Le prototype devrait ressembler à quelque chose comme ceci:

uint8_t *encode_png_to_buffer(RGBBitmap *source);

Et il semble que je n'aurais sans doute besoin de faire usage de png_set_write_fn().

Mais hormis cela, je ne suis pas sûr de savoir comment aborder cette. Existe-il des exemples de ce que cela soit fait? Je ne suis sûrement pas le premier à avoir besoin de cette fonctionnalité.

  • Tout d'abord, essayez de le chercher à compiler. Vérifiez la définition de save_png_to_file manquantes * ie RGBBitmap * bitmap (que vous êtes sur le traitement de l'image bitmap comme il est un pointeur plus tard. Et où est bytes_per_pixel défini? (nulle part!)
  • Que voulez-vous dire exactement par "encoder au format PNG à une mémoire tampon"? Voulez-vous dire coder une image au format PNG à une mémoire tampon? Entendez-vous décoder un PNG à un tampon?
  • Ah, désolé pour les fautes de frappe, j'ai fixé. Désolé si je n'étais pas clair; ce que je veux dire, c'est: j'ai décompressé bitmap dans la "RGBBitmap" structure que je veux convertir en PNG. Je ne veux pas écrire ce PNG dans un fichier, si, je veux juste un cru de la mémoire tampon de données qui serait écrit.
  • Je pense que row_pointers = png_malloc(png_ptr, bitmap->hauteur * sizeof(png_byte )); doit être png_byte *row = (png_byte)png_malloc(png_ptr, sizeof(u_int8_t) * bitmap->bytes_per_pixel * bitmap->largeur);
  • s'il vous plaît comment avez-vous eu installé libpng, parce que je ne pouvais pas être en mesure d'utiliser #include <png.h> sur windows.
InformationsquelleAutor Sam | 2009-11-30