algumas habilidades de programacao em C puro, voce pode entender que as coisas ficam mais faceis de entender.No construtor nao existe nenhum codigo especial.O metodo load e o maior, entao vamos iniciar vendo outras partes do codigo.O metodo release e responsavel por liberar o atributo data da memoria. O usuario podera chama-lo logo apos usar os dados da imagem. Naoha nada complicado de se entender aqui, ha apenas uma verificacao para certificarmos que nao tentaremos deletar de um ponteiro nulo.O destrutor faz apenas uma chamada para o metodo release, assim, se o usuario esquecer de chamar o metodo release, a memoria para data seraliberada quando o objeto ja nao for mais necessario e for destruido.Bem, chegou a vez do metodo load. Nos comecamos chamando algumas variaveis locais. As variaveis mais importantes sao png_ptr e info_ptr.A variavel png_ptr e usada pela libpng para decodificar a imagem, enquanto info_ptr e usada para manter as informacoes sobre a imagem. A partirda versao 1.5.0 da libpng o acesso direto aos membros das estruturas de dados internos ficou depreciado. Entao voce precisara usar as funcoes png_get_*e png_set_*, onde o asterisco significa o nome do membro que voce deseja acessar ou alterar.O proximo passo e abrir o arquivo de imagem, o que e feito pelo objeto ifstream ifile. Assim, sao passado, na instanciacao do objeto, o nome do arquivoe o modo de acesso para binario.Com o arquivo aberto com sucesso, nos verificamos a assinatura do arquivo PNG. Isso e feito pela funcao png_check_sig.Para isso, nos passamos um pequeno buffer de oito bytes, que e o tamanho para assinatura PNG.Uma vez que a imagem esta pronta para ser lida, nos alocamos memoria para png_ptr com a funcao png_create_read_struct.Apos isso, info_ptr e inicializada com a funcao png_create_info_struct. Se tudo deu certo, e hora para o proximo passo.Agora nos informamos a libpng que temos um callback para leitura da imagem. Dessa forma, nos podemos ler a imagem da maneira que desejarmos. Nessetutorial nos iremos usar a classe ifstream da STL. Assim nos passamos o ponteiro para nosso objeto. E a chamada final para a funcao e:png_set_read_fn( png_ptr, (void*)ifile, readFileCallback );Onde png_ptr e o nosso ponteiro para decodificar a imagem; ifile e o objeto leitor da ifstream e readFileCallback e a funcao que ira ler cada porcao ouchunk do arquivo de imagem.Para melhor entender essa funcao, vamos ve-la em detalhes.void readFileCallback( png_structp png_ptr, png_bytep out, png_size_t count ){ png_voidp io_ptr = png_get_io_ptr( png_ptr ); if( io_ptr == 0 ) { return; } std::ifstream &ifs = *(std::ifstream*)io_ptr; ifs.read( (char*)out, count );}A funcao precisa ter exatamente a mesma assinatura acima. Ela aceita tres argumentos. O primeiro e o ponteiro para png_struct, png_ptr. O ponteiro png_byte, out, e oponteiro para ler o conteudo dentro da funcao. E o numero de bytes para ler e dado pelo argumento count do tipo png_size_t.A primeira coisa a ser feita e recuperar o ponteiro para nosso objeto ifstream. Entao nos usamos a funcao png_get_io_ptr para obter o membro io_ptr da estrutura png_ptr.Depois de verificar se o ponteiro esta setado, e criado um objeto ifstream que aponta para io_ptr. Dessa