반응형
출처 : http://www.adevgames.com/wordpress/?tag=png

手上有好些,前一阶段的工作成果.一直没有时间整理出来.
先把cola2d 里面使用的一些基础整理下.

在ndk 下如何读取png到opengl es 的texture了?
其实做法和linux下面没什么区别,我们首先要用到libpng这个开源的库.
从 http://www.libpng.org/pub/png/libpng.html 下载到 libpng-1.2.41这个版本.

然后在android ndk 新建一个libpng的project .
我的android.mk 文件如下.

  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. LOCAL_MODULE :png  
  4. LOCAL_CFLAGS := -I$(LOCAL_PATH)  \  
  5.     -DPNG_USE_GLOBAL_ARRAYS \  
  6.     -DPNG_READ_SUPPORTED  
  7.   
  8. LOCAL_CPP_EXTENSION := .cpp  
  9.   
  10. # Note this simple makefile var substitution, you can find even simpler examples in different Android projects  
  11. LOCAL_SRC_FILES :=  $(notdir $(wildcard $(LOCAL_PATH)/*.c))  
  12. include $(BUILD_STATIC_LIBRARY)  

这样就可以编译好libpng.a

需要注意的是 如果使用该库,链接时,需要加上-lz 这儿需要带上zlib库 这个库,android ndk 已经自带了.不需要自行编译.

opengl es 如何使用该库读取一个png图片了?
读取png 代码:

  1. unsigned char* Texture::ReadPNG (const char* file, png_uint_32* w, png_uint_32* h)  
  2. {  
  3.     FILE* f;  
  4.     unsigned char sig[8];  
  5.     png_structp png_ptr;  
  6.     png_infop   info_ptr;  
  7.     unsigned char* image_data;  
  8.     int bit_depth;  
  9.     int color_type;  
  10.     unsigned int rowbytes;  
  11.     png_uint_32 i;  
  12.     png_bytepp row_pointers;  
  13.   
  14.     if ((f = fopen(file, "rb")) == NULL)  
  15.         return NULL;  
  16.     fread(sig, sizeof(*sig), sizeof(sig), f);  
  17.     if (!png_check_sig(sig, sizeof(*sig))) {  
  18.         fclose(f);  
  19.         return NULL;  
  20.     }  
  21.     if ((png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL) {  
  22.         fclose(f);  
  23.         return NULL;  
  24.     }  
  25.     if ((info_ptr = png_create_info_struct(png_ptr)) == NULL) {  
  26.         png_destroy_read_struct(&png_ptr, NULL, NULL);  
  27.         fclose(f);  
  28.         return NULL;  
  29.     }  
  30.   
  31.     if (setjmp(png_jmpbuf(png_ptr))) {  
  32.         png_destroy_read_struct(&png_ptr, &info_ptr, NULL);  
  33.         fclose(f);  
  34.         return NULL;  
  35.     }  
  36.     png_ptr->io_ptr = (png_voidp) f;  
  37.     png_set_sig_bytes(png_ptr, 8);  
  38.   
  39.     png_read_info(png_ptr, info_ptr);  
  40.     png_get_IHDR(png_ptr, info_ptr, w, h, &bit_depth, &color_type, NULL, NULL, NULL);  
  41.     if (color_type & PNG_COLOR_MASK_ALPHA)  
  42.         png_set_strip_alpha(png_ptr);  
  43.     if (bit_depth > <img src="http://www.adevgames.com/wordpress/wp-includes/images/smilies/icon_cool.gif" alt="8)" class="wp-smiley" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; padding-top: 5px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; ">  
  44.         png_set_strip_16(png_ptr);  
  45.     if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA)  
  46.         png_set_gray_to_rgb(png_ptr);  
  47.     if (color_type == PNG_COLOR_TYPE_PALETTE)  
  48.         png_set_palette_to_rgb(png_ptr);  
  49.     png_read_update_info(png_ptr, info_ptr);  
  50.   
  51.     rowbytes = png_get_rowbytes(png_ptr, info_ptr);  
  52.     if ((image_data =(unsigned char *) malloc(*h * rowbytes)) == NULL) {  
  53.         png_destroy_read_struct(&png_ptr, &info_ptr, NULL);  
  54.         fclose(f);  
  55.         return NULL;  
  56.     }  
  57.     if ((row_pointers =(png_bytepp) malloc(*h * sizeof(png_bytep))) == NULL) {  
  58.         png_destroy_read_struct(&png_ptr, &info_ptr, NULL);  
  59.         fclose(f);  
  60.         free(image_data);  
  61.         return NULL;  
  62.     }  
  63.   
  64.     for (i = 0; i < *h; i++)  
  65.         row_pointers[*h - 1 - i] = image_data + i*rowbytes;  
  66.     png_read_image(png_ptr, row_pointers);  
  67.     free(row_pointers);  
  68.     png_destroy_read_struct(&png_ptr, &info_ptr, NULL);  
  69.     fclose(f);  
  70.   
  71.     return image_data;  
  72. }  

然后使用
下面方法即可读入到texture里面

  1. m_width=imgw;  
  2.     m_height=imgh;  
  3.       glGenTextures(1, &m_id);  
  4.         glBindTexture(GL_TEXTURE_2D, m_id);  
  5.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imgw, imgh, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);  
  6.         GLint crop[4] = { 0, 0, m_width, m_height };  
  7.     glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);  
  8.     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  
  9.     glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  
  10.     //glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);  
  11.     glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );  

这部分内容和普通opengl es 的开发都没有区别.

반응형

'Android' 카테고리의 다른 글

Android MediaScanner (SDCARD 갱신)  (0) 2010.03.29
안드로이드에서 사용하는 폰트와 사운드 데이터  (0) 2010.03.22
Android Bluetooth  (0) 2010.03.22
Posted by Real_G