现在的位置: 首页 > 综合 > 正文

mobile下使用png图片的三种方法

2013年04月12日 ⁄ 综合 ⁄ 共 1655字 ⁄ 字号 评论关闭

N久没有写过博客了,主要是人太懒,有时间就玩游戏了……

不过这次下决心,一周写一次,一是记录一周的生活变化及技术的进步。

工作三个月了,到公司之后主要做Mobile方面的开发,因为以前自学过Windows程序设计,虽然水平很次,但大概有个思想了,所以上手也比较快。

这周主要是做那个Mobile上的桌面插件呢,类似于QuickClock的插件,但因水平太次,光搞png图片就搞了两天,到现在还没完全弄清楚。

Mobile上使用png图片的方法也不算少,但周一的时候就知道有个libpng库,然后找例子来看怎么用,想自己通过libpng库来实现将png图片的载入。

Libpng是一个开源的png解码库,也有相应的mobile版本。要想载入使用,它里面的两个非常重要的结构一定要知道,一是png_structp,再一个就是png_infop

Png_structp是图片结构指针吧,png_infop是信息指针,在png.h里面有它们的详细定义。使用png_create_read_struct函数,执行成功后就会返回png_structp结构指针,里面也包含了图片的各种信息。然后就可以设置png_ptr->io_ptr,将png图片的文件指针赋给它,具体是怎么回事我也不清楚,呵呵。接着调用png_read_png来解码,这种方法是一次性将整个图片进行解码。不过也可以一行一行的解,有png_read_row等函数。

最后读出来的数据还要通过转换才能使用,因为我也是迷迷乎乎的看了一下,所以也没有深入,现在也只知道一个大概。

不过如果想简单的使用png图片,比如说,这时候你只有png图片,但又不想使用它的透明色之类的,直接用SHLoadImageFile,这个函数很好用。这个可能是mobile下专有的吧,不知道pc上面能不能用。

还有一个方法就是使用Iimage接口。这个方法很好用,但因为它要往目标dc上画的时候,每次画,每次解码,所以你要做动画的话,可能速度会根不上。

因为使用也很简单,大概贴一下它的代码就行了:

  1. IImagingFactory *pImgFactory = NULL;
  2.     IImage *pImage = NULL;
  3.     HDC hdc = GetWindowDC(hWnd);
  4.     CoInitializeEx(NULL, COINIT_MULTITHREADED);
  5.     // Create the imaging factory.
  6.     if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory,
  7.         NULL,
  8.         CLSCTX_INPROC_SERVER,
  9.         IID_IImagingFactory,
  10.         (void **)&pImgFactory)))
  11.     {
  12.         // Load the image from the JPG file.
  13.         if (SUCCEEDED(pImgFactory->CreateImageFromFile(
  14.             TEXT("//image.png"),
  15.             &pImage)))
  16.         {
  17.             //将图片数据写入到g_hBkDC中
  18.             RECT rcBmp = {0, 0, Width, Height};
  19.             pImage->Draw(hdc, &rcBmp, NULL);
  20.             pImage->Release();
  21.         }
  22.         pImgFactory->Release();
  23.     }
  24.     CoUninitialize();

本来还想在这周看看tapi呢,一晃就到周五了,唉,只能到下周了……

 

(我是菜鸟一个,上面可能有很多错误,希望大家能够提出批评指正,貌视上面还有好多笔误,再编辑一下……)

 

抱歉!评论已关闭.