|
|
发表于 2004-11-13 21:56:00
|
显示全部楼层
Re: 如何读取PNG格式文件并在DX中显示?
解决方法一:
http://frustum.org/3d/file/libpng-1.2.5.tar.gz,用这库
解决方法二:
用这个读D3DXCreateTextureFromFile,然后取数据,再创建SURFACE,好像应该也可以。不大清楚。
方法一的调用
- #include "png.h"
- unsigned char *load_png(FILE *file,int &width,int &height) {
- png_byte sig[8];
- fread(sig,8,1,file);
- if(!png_check_sig(sig,8)) {
- fprintf(stderr,"load_png(): wrong signature\n");
- return NULL;
- }
- png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0);
- if(!png_ptr) return NULL;
- png_infop info_ptr = png_create_info_struct(png_ptr);
- if(!info_ptr) {
- png_destroy_read_struct(&png_ptr,0,0);
- return NULL;
- }
- png_init_io(png_ptr,file);
- png_set_sig_bytes(png_ptr,8);
- 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);
- delete row;
- width = w;
- height = h;
- unsigned char *data = new unsigned char[width * height * 4];
- 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;
- }
- }
- delete img;
- return data;
- }
复制代码 |
|