游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2493|回复: 3

如何读取PNG格式文件并在DX中显示?

[复制链接]

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2004-11-13 21:34:00 | 显示全部楼层 |阅读模式
如何读取PNG格式文件并在DX中显示?

CreatSurfaceFromFile是不行的,有什么好办法呢?实在不想把一个个PNG格式的文件转换成BMP和一个个MASK了,半透明的MASK多难做呀,直接读取PNG的方法有吗?

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
发表于 2004-11-13 21:56:00 | 显示全部楼层

Re: 如何读取PNG格式文件并在DX中显示?

解决方法一:
http://frustum.org/3d/file/libpng-1.2.5.tar.gz,用这库

解决方法二:
用这个读D3DXCreateTextureFromFile,然后取数据,再创建SURFACE,好像应该也可以。不大清楚。

方法一的调用

  1. #include "png.h"
  2. unsigned char *load_png(FILE *file,int &width,int &height) {
  3.         png_byte sig[8];
  4.         fread(sig,8,1,file);
  5.         if(!png_check_sig(sig,8)) {
  6.                 fprintf(stderr,"load_png(): wrong signature\n");
  7.                 return NULL;
  8.         }
  9.         png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,0,0,0);
  10.         if(!png_ptr) return NULL;
  11.         png_infop info_ptr = png_create_info_struct(png_ptr);
  12.         if(!info_ptr) {
  13.                 png_destroy_read_struct(&png_ptr,0,0);
  14.                 return NULL;
  15.         }
  16.         png_init_io(png_ptr,file);
  17.         png_set_sig_bytes(png_ptr,8);
  18.         png_read_info(png_ptr,info_ptr);
  19.         unsigned long w,h;
  20.         int bit_depth,color_type;
  21.         png_get_IHDR(png_ptr,info_ptr,&w,&h,&bit_depth,&color_type,0,0,0);
  22.         if(bit_depth == 16) png_set_strip_16(png_ptr);
  23.         if(color_type == PNG_COLOR_TYPE_PALETTE) png_set_expand(png_ptr);
  24.         if(bit_depth < 8) png_set_expand(png_ptr);
  25.         if(png_get_valid(png_ptr,info_ptr,PNG_INFO_tRNS)) png_set_expand(png_ptr);
  26.         if(color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png_ptr);
  27.         double gamma;
  28.         if(png_get_gAMA(png_ptr,info_ptr,&gamma)) png_set_gamma(png_ptr,(double)2.2,gamma);
  29.         png_read_update_info(png_ptr,info_ptr);
  30.         png_get_IHDR(png_ptr,info_ptr,&w,&h,&bit_depth,&color_type,0,0,0);
  31.         png_uint_32 row_bytes = png_get_rowbytes(png_ptr,info_ptr);
  32.         png_uint_32 channels = png_get_channels(png_ptr,info_ptr);
  33.         png_byte *img = new png_byte[row_bytes * h];
  34.         png_byte **row = new png_byte*[h];
  35.         for(int i = 0; i < (int)h; i++) row[i] = img + row_bytes * i;
  36.         png_read_image(png_ptr,row);
  37.         png_read_end(png_ptr,NULL);
  38.         png_destroy_read_struct(&png_ptr,0,0);
  39.         delete row;
  40.         width = w;
  41.         height = h;
  42.         unsigned char *data = new unsigned char[width * height * 4];
  43.         unsigned char *ptr = data;
  44.         for(int i = 0; i < height; i++) {
  45.                 for(int j = 0; j < width; j++) {
  46.                         int k = row_bytes * i + j * channels;
  47.                         *ptr++ = img[k + 0];
  48.                         *ptr++ = img[k + 1];
  49.                         *ptr++ = img[k + 2];
  50.                         if(channels == 4) *ptr++ = img[k + 3];
  51.                         else *ptr++ = 255;
  52.                 }
  53.         }
  54.         delete img;
  55.         return data;
  56. }

复制代码

10

主题

88

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2004-11-13 22:43:00 | 显示全部楼层

Re: 如何读取PNG格式文件并在DX中显示?

看来我还是改行学c++吧……

3

主题

95

帖子

107

积分

注册会员

Rank: 2

积分
107
发表于 2004-11-14 15:25:00 | 显示全部楼层

Re:如何读取PNG格式文件并在DX中显示?

推荐使用pnglib,其实D3DX也是用的pnglib来解PNG的,JPG就是用的ijl解的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 07:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表