yssi83 Skrevet 20. april 2007 Del Skrevet 20. april 2007 (endret) Jeg prøver å lage et enkelt program som skal lese pixel-verdiene i en PNG-bildefil inn i et to-dimensjonalt array. Jeg har funnet og linket libpng og zlib for å kunne lese inn bildefilen, men skjønner ikke så mye av dokumentasjonsfilen. Hvordan finner jeg pixelverdiene i et slikt bilde? Er det noen som har erfaring med disse bibliotekene som kan hjelpe meg i gang? Jeg skal programmere i c++. Endret 20. april 2007 av yssi83 Lenke til kommentar
Giddion Skrevet 20. april 2007 Del Skrevet 20. april 2007 Jeg prøver å lage et enkelt program som skal lese pixel-verdiene i en PNG-bildefil inn i et to-dimensjonalt array. Jeg har funnet og linket libpng og zlib for å kunne lese inn bildefilen, men skjønner ikke så mye av dokumentasjonsfilen. Hvordan finner jeg pixelverdiene i et slikt bilde? Er det noen som har erfaring med disse bibliotekene som kan hjelpe meg i gang? Jeg skal programmere i c++. 8427865[/snapback] jeg bruker C til lesing av filer med det fikser du sikkert bra koden under er litt gammel, så jeg hadde ikke så mye erfaring da jeg skrev den, men den funker fint og gjøre jobben. Et lite ord om alpha kanal. Jeg bruker den så koden vil nok reflektere det og jeg regner med du ikke vil bruke det, men hvis du vil så bare følg kommentarene mine. Klikk for å se/fjerne innholdet nedenfor void CTexture::LoadPNG(FILE* fFile) { // std::vector <void*> AllocMem; png_byte sig[8]; fread(sig,8,1,fFile); if(!png_check_sig(sig,8)) { fclose(fFile);//wrong signature return; } png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0); if(!png_ptr) { fclose(fFile); return; } png_infop info_ptr = png_create_info_struct(png_ptr); if(!info_ptr) { png_destroy_read_struct(&png_ptr,0,0); fclose(fFile); return; } png_init_io(png_ptr,fFile); png_set_sig_bytes(png_ptr,8); png_set_keep_unknown_chunks(png_ptr,0,0,0); png_read_info(png_ptr,info_ptr); unsigned long w,h; int bit_depth,color_type; png_get_IHDR(png_ptr,info_ptr,&w,&h,&bit_depth,&color_type,0,0,0); if(bit_depth == 16) png_set_strip_16(png_ptr); if(color_type == PNG_COLOR_TYPE_PALETTE) png_set_expand(png_ptr); if(bit_depth < 8) png_set_expand(png_ptr); if(png_get_valid(png_ptr,info_ptr,PNG_INFO_tRNS)) png_set_expand(png_ptr); if(color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png_ptr); double gamma; if(png_get_gAMA(png_ptr,info_ptr,&gamma)) png_set_gamma(png_ptr,(double)2.2,gamma); png_read_update_info(png_ptr,info_ptr); png_get_IHDR(png_ptr,info_ptr,&w,&h,&bit_depth,&color_type,0,0,0); png_uint_32 row_bytes = png_get_rowbytes(png_ptr,info_ptr); png_uint_32 channels = png_get_channels(png_ptr,info_ptr); png_byte *img = new png_byte[row_bytes * h]; png_byte **row = new png_byte*[h]; for(int i = 0; i < (int)h; i++) row[i] = img + row_bytes * i; png_read_image(png_ptr,row); png_read_end(png_ptr,NULL); png_destroy_read_struct(&png_ptr,0,0); fclose(fFile); delete row; width = w; height = h; unsigned char* Data = new unsigned char[width * height * 3];//gang med 4 hvis du vil ha alpha unsigned char* ptr = Data; for(int i = 0; i < height; i++) { for(int j = 0; j < width; j++) { int k = row_bytes * i + j * channels; *ptr++ = img[k + 0]; *ptr++ = img[k + 1]; *ptr++ = img[k + 2]; //if(channels == 4) // *ptr++ = img[k + 3]; //else // *ptr++ = 255;//setter alpha til 255 } } if(channels == 4) glTexImage2D(GL_TEXTURE_2D,0,3,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,Data); else glTexImage2D(GL_TEXTURE_2D,0,3,width,height,0,GL_RGB,GL_UNSIGNED_BYTE,Data); // FreeMem(&AllocMem); delete img; //NB: Husk deallokering av Data! return; } Lenke til kommentar
yssi83 Skrevet 20. april 2007 Forfatter Del Skrevet 20. april 2007 Takk skal du ha. Jeg skal se om jeg ikke forstår det nå. 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å