Gå til innhold

noen som har brukt libpng?


Anbefalte innlegg

Jeg prøver å få til libpng nå, men når jeg leser skriver den ingenting til bufferet, det må bety at det er noe jeg ikke har gjort, eller gjort galt.

Jeg får tak i dimensjoner av bildet (width, height, channels, bitdepth o.s.v.)

men png_read_png gjør egentlig ingening (leser info structure kanskje?)

det står jo i libpng-manual at jeg må bruke png_get_rows(), men stort sett skjer det ingenting.

 

png_read_image() får jeg bare en minneallokeringsfeil av å bruke... :nei:

 

hjelp....?

Lenke til kommentar
Videoannonse
Annonse

Her er noe gammel kode jeg brukte for et år sida. husker ikke så mye av det nå så jeg orker ikke begynne å se å forklare.

 

HEADER:

 

#include "image.h"

#ifndef _PNG_IMAGE_H  /* png_image.h */
#define _PNG_IMAGE_H

class Png_Image : public Image {
public:
Png_Image(char* file_name);
unsigned char* get_pixel_data();
};

#endif /* png_image.h */

 

CPP:

 

#include "png_image.h"
#include <png.h>
#include <cstdio>
#include <cstdlib>
#include <sys/types.h>
#include <sys/stat.h>
#include <windows.h>
using namespace std;

unsigned char* curr_pnt;
FILE* fp;

void user_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
{
fread(data, sizeof(unsigned char), length, fp);

/*
 *  haven't yet decided if i want to read the whole file into memory then 
 *  convert it, or if i should just read chunks directly
 */

/*memcpy(data, curr_pnt, length);
curr_pnt += length;*/
}

Png_Image::Png_Image(char* file_name)
{
fp = fopen(file_name, "rb");
if(!fp) {
 return;
}
struct _stat buf;
_stat(file_name, &buf);
unsigned long int file_size = buf.st_size;
/*this->rdata = (unsigned char*)malloc(file_size);
fread(this->rdata, sizeof(unsigned char), file_size, fp);
curr_pnt = this->rdata;*/
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if(!png_ptr) {
 return;
}
png_infop info_ptr = png_create_info_struct(png_ptr);
if(!info_ptr) {
 png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
 return;
}
png_infop end_info = png_create_info_struct(png_ptr);
if(!end_info) {
 png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
 return;
   }
if (setjmp(png_jmpbuf(png_ptr)))
{
 png_destroy_read_struct(&png_ptr, &info_ptr,
 	&end_info);
 fclose(fp);
 return;
}
png_set_read_fn(png_ptr, 0, user_read_data);
png_read_info(png_ptr, info_ptr);
png_get_IHDR(png_ptr, info_ptr, (png_uint_32*)&this->width, (png_uint_32*)&this->height, &this->bpp, &this->color_type, 0, 0, 0);
if (color_type == PNG_COLOR_TYPE_GRAY) {
 this->bpp = 8;
}
if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
 this->bpp = 16;
}
if (color_type == PNG_COLOR_TYPE_PALETTE) {
 this->bpp = 32;
}
if (color_type == PNG_COLOR_TYPE_RGB) {
 this->bpp = 24;
}
if (color_type == PNG_COLOR_TYPE_RGBA) {
 this->bpp = 32;
}
this->data = (unsigned char*)malloc((this->width * this->height * this->bpp) / 8);
png_set_packing(png_ptr);
if (this->color_type == PNG_COLOR_TYPE_PALETTE)
 png_set_expand(png_ptr);
if (this->color_type == PNG_COLOR_TYPE_GRAY && this->bpp < 8)
 png_set_expand(png_ptr);
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
 png_set_expand(png_ptr);
png_bytep* row_pointers = (png_bytep *)(malloc(sizeof(png_bytep) * this->height));
for (int row = 0; row < height; row++) {
 row_pointers[row] = this->data + (this->width * row * this->bpp / 8);
}
png_read_image(png_ptr, row_pointers);
free(row_pointers);
png_read_end(png_ptr, info_ptr);
png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
fclose(fp);
}

unsigned char* Png_Image::get_pixel_data() 
{
return this->data;
}

 

tror forresten at jeg rippa mesteparten av amoeba sourcen så du kan jo laste ned den istedet. Den er gpl da :( men du ser hvertfall hvordan det virker så kan du lage en ny

Endret av saboi
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...