GeirGrusom Skrevet 20. august 2004 Del Skrevet 20. august 2004 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... hjelp....? Lenke til kommentar
saboi Skrevet 20. august 2004 Del Skrevet 20. august 2004 (endret) 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 20. august 2004 av saboi Lenke til kommentar
GeirGrusom Skrevet 21. august 2004 Forfatter Del Skrevet 21. august 2004 Takk for hjelpa! den var god! Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå