Gå til innhold

PNG bildebehandling med libpng- trenger hjelp


Anbefalte innlegg

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 av yssi83
Lenke til kommentar
Videoannonse
Annonse
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

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...