Mais uma vez tendo que parar, por um momento, espero, com o projeto do clone de BomberMan. Semana de provas, e curso online no Coursera de Programacao de aplicativos para dispositivos moveis com sistema Android: Part 1. Otimo site de cursos online, inclusive. Com cursos gratuitos e, no caso desse, otimo para preparar para o mercado com chances de expor trabalhos para a Amazon. Para os 50 melhores alunos de 500.000, claro o/Em breve retomo o projeto e posto resultados. Eu fiz este tutorial porque vi que nao existe nenhuma ou pouca documentacao sobre o uso da libpng nas novas versoes.Uma vez que existem algumas grandes mudancas no codigo da libpng, muitas informacoes podem estar invalidas.Bem, antes de qualquer coisa, voce precisa baixar a biblioteca, compilar e deixa-la pronta para uso. Eu nao irei cobrir esses passosnessa tutorial.Com tudo no lugar, abra seu editor favorito e crie um arquivo de cabecalho:PngLoader.h:#ifndef __PNGLOADER_H__#define __PNGLOADER_H__#include <string>#include <png.h>class PngLoader{public: PngLoader(); ~PngLoader(); bool load( std::string file ); const char *getData() const { return data; } int getWidth() const { return width; } int getHeight() const { return height; } int getDepth() const { return depth; } int getColorType() const { return color_type; }private: void release(); char *data; int width; int height; int depth; int color_type;};#endifEsta e uma classe simples, que ira apenas garantir acesso para ler os dados na memoria. Voce pode, certamente,fazer as alteracoes que desejar para mudar os dados, por exemplo (se voce possui o devido conhecimento para isso).Note que existe algumas outras informacoes que voce pode obter pela libpng sobre sua imagem PNG. Se voce precisar dealguma dessas informacoes voce tera que adicionar os atributos e metodos correspondentes na sua classe.Vamos agora criar o aquivo fonte.PngLoader.cpp:#include "PngLoader.h"#include <fstream>#include <string>#include <sstream>void readFileCallback( png_structp png_ptr, png_bytep out, png_size_t count );PngLoader::PngLoader(void) :data(0){}bool PngLoader::load( std::string file ){ png_structp png_ptr; png_infop info_ptr; std::ifstream ifile( file.c_str(), std::ios::binary ); if( !ifile.is_open() ) return false; char assinatura[8]; ifile.read( &assinatura[0], 8 * sizeof(char) ); if(!png_check_sig( (png_bytep)assinatura, 8) ) { return false; } png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0); if(png_ptr == 0) { return false; } info_ptr = png_create_info_struct( png_ptr ); if( info_ptr == 0 ) { png_destroy_read_struct( &png_ptr, 0, 0 ); return false; } png_set_read_fn( png_ptr, (void*)&ifile, readFileCallback ); png_set_sig_bytes( png_ptr, 8 ); png_read_info( png_ptr, info_ptr ); png_get_IHDR( png_ptr, info_ptr, (png_uint_32*)&width, (png_uint_32*)&height, &depth, &color_type, 0, 0, 0 ); png_size_t cols = png_get_rowbytes(png_ptr, info_ptr); png_bytepp row_pp = new png_bytep[height]; data = new char[ cols * height ]; for( int i = 0; i < height; ++i ) { row_pp[height - i - 1] = (png_bytep)&data[ i * cols ]; } png_read_image( png_ptr, row_pp ); png_read_end( png_ptr, info_ptr ); png_destroy_read_struct( &png_ptr, &info_ptr, 0 ); delete[] row_pp; return true;}void PngLoader::release(){ if( data ) delete[] data; data = 0;}PngLoader::~PngLoader(void){ release();}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 );}Aqui o codigo pode parecer um pouco confuso. Os caras da libpng escolheram nomes grandes para suas funcoes e estruturas de dados. Masdessa forma, se voce possui