在PC环境下用VS2005编译供Wince6.0使用的libpng和zlib库


移植libpng和zlib库到WINCE6.0系统编译的相关网帖

1.wince下的libpng!----http://topic.csdn.net/u/20100429/13/3055dad4-ac93-4d0c-820d-b04f07df390d.html

2.libpng问题----http://topic.csdn.net/u/20090811/13/f8f60a8a-b209-4b61-ba7c-de0df5b20f30.html



编译的基本步骤如下

    1》先去相关网页下载供WINCE使用的libpng和zlib库源代码

    http://www.libpng.org/pub/png/libpng.html

   http://www.tenik.co.jp/~adachi/wince/-------------提供有WINCE使用的版本下载


    其实也可以去下载CXIMAGE的WINCE版本,因为里面也有libpng和zlib这两个工程----CXIMAGE的 WINCE下载地址::http://www.xdp.it/download.htm

     
   有关CXIAMGE库移植到WINCE可以参考网帖----教程:CXIMAGE 移植 CE 平台----http://blog.csdn.net/xqhrs232/article/details/5339575




    2》源代码里面没有针对VS2005的工程,那就自己对应创建吧-----创建2个针对SMART设备的WIN32空DLL工程


   3》把libpng和zlib库源代码加进工程里面去,再编译,查看编译错误对应解决-----把不需要编译进DLL的源文件从工程中排除掉

      libpng project----delete pngtest.c    zlib project----delete maketree.c /minigzip.c(这两个文件里面有main( )函数,所以删除了,但没想明白为什么)

   4》这样就可以得到libpng和zlib库的DLL/LIB文件了

   5》写一个测试工程测试编译出来的DLL/LIB文件-----网上有很多怎么去读取PNG文件的文章可以借鉴
      
       使用libpng读取png图像----http://blog.csdn.net/xqhrs232/article/details/7685296

      有关LIBPNG库里面的高级与低级函数的联系与区别可以参考----图像解码之二——使用libpng解码png图片----http://blog.csdn.net/xqhrs232/article/details/7703281


     还有就是LIBPNG库里面自带的文档


   6》利用应用工程调试ibpng和zlib库的DLL/LIB文件----对应的配置文件要不要修改/宏编译要禁止还是使能


       A.在这个地方有一个特别要注意的地方----你的PNG文件的打开与操作的函数要很好地统一起来----fopen/fread/fclose++++createfile/readfile/closehandle最好配对使用

      网上有很多因为这个问题而出现的帖子,本文引用的那两个问题帖也是因为这个原因引起的!!!下面的一段文字引自pngrio.c


#if !defined(PNG_NO_STDIO)
/* This is the function that does the actual reading of data.  If you are
   not reading from a standard C stream, you should create a replacement
   read_data function and use it at run time with png_set_read_fn(), rather
   than changing the library. */
#ifndef USE_FAR_KEYWORD
void PNGAPI
png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
{
   png_size_t check;


   if(png_ptr == NULL) return;
   /* fread() returns 0 on error, so it is OK to store this in a png_size_t
    * instead of an int, which is what fread() actually returns.
    */
#if defined(_WIN32_WCE)
   if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
      check = 0;
#else
   check = (png_size_t)fread(data, (png_size_t)1, length,
      (png_FILE_p)png_ptr->io_ptr);
#endif


   if (check != length)
      png_error(png_ptr, "Read Error");
}
#else

......


#endif




       B.看看pngconf.h要不要加入如下定义

  /* abort() function is not supported on WindowsCE */
#  define PNG_ABORT() exit(-1)

       C.有问题最好追踪一下代码,看看具体调的是那个函数,在新的平台是不是要换成支持的来完成


   7》测试通过的DLL/LIB文件就可以发布使用了





//==========================================================================================================

备注::

 

   1>注意BMP数据反向的问题,那个是第一行,那个是最后一行,怎么进行反向----因为由解码出来的PIXELDATA直接去形成HBITMAP贴图,图片的颜色是不对的。

   一般解码出来的是RGBA的格式,这个图片用于产生用于OPENGL的纹理是可以直接使用的,因为OPENGL直接支持GL_RGBA格式的数据直接产生纹理。但要用于形成HBITMAP贴图则要注意必要的变换。




  2>PC上不支持PNG的ALPHABLEND?我的透明PNG怎么显示出来有问题啊----不知道我的解码是不是存在问题,得仔细看看。



3>怎么进行必要的格式转换-----可以用于产生HBITMAP贴图

    加载png图片并转换为DIB HBITMAP----http://blog.csdn.net/xqhrs232/article/details/7704506

  1.  for (y=0; y<info_ptr->height; y++)  
  2.             {  
  3.                 for (x=0; x<info_ptr->width; x++)  
  4.                 {  
  5.                     i=(info_ptr->height-1-y)*info_ptr->width*4+x*4;  
  6.   
  7.                     r=pBits[i+0];  
  8.                     g=pBits[i+1];  
  9.                     b=pBits[i+2];  
  10.                     a=pBits[i+3];  
  11.   
  12.                     // RGBA -> BGRA and to AlphaBend() Colors   
  13.                     pBits[i+0]=BYTE(b * a / 255);  
  14.                     pBits[i+1]=BYTE(g * a / 255);  
  15.                     pBits[i+2]=BYTE(r * a / 255);  
  16.                 }  
  17.   
  18.             }  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值