原文:http://blog.sina.com.cn/s/blog_4a0a39c30100b8w6.html
libpng(http://www.libpng.org/)是讀取PNG(Portable Network Graphic
Format)檔案的最官方的函數庫,所以在介紹libpng之前,有必要先介紹下PNG檔案。
PNG是20世紀90年代中期開始開發的影像檔儲存格式,其目的是企圖替代GIF和TIFF檔案格式,同時增加一些GIF檔案格式所不具備的特性。流式網狀圖形格式(Portable
Network Graphic Format,PNG)名稱來源於非官方的“PNG's Not GIF”,是一種位元影像檔案(bitmap
file)儲存格式,讀成“ping”。PNG用來儲存灰階映像時,灰階映像的深度可多到16位,儲存彩色映像時,彩色映像的深度可多到48位,並且還可儲存多到16位的α通道資料。PNG使用從LZ77派生的無損資料壓縮演算法。
PNG用了無損資料壓縮演算法,用的壓縮庫上是上一篇介紹的zlib,編譯libpng前,要先編譯zlib(請參見上一篇:Android原生(Native)C開發之五:zlib移植筆記)。
先從sourceforge下載libpng的最新版本:1.2.33,請選擇without config
script版本:bz2格式,zip格式,這個版本沒有configure檔案,因為基本上不需要改動libpng的設定,就能編譯通過。
將下載的源碼包解開,得到時一個名為 libpng-1.2.33 的目錄,將 scripts/makefile.gcc 複製到
libpng-1.2.33/Makefile,將此檔案的 8 - 27 行改成如下即可(粗體為增加部分):
... ZLIBINC = ../zlib-1.2.3 ZLIBLIB = ../zlib-1.2.3# Compiler, linker, lib and other tools CC = arm-none-linux-gnueabi-gcc LD = $(CC) AR_RC = arm-none-linux-gnueabi-ar rcs RANLIB = arm-none-linux-gnueabi-ranlib RM_F = rm -f CDEBUG = -g -DPNG_DEBUG=5 LDDEBUG = CRELEASE = -O2 LDRELEASE = -s -static #CFLAGS = -W -Wall $(CDEBUG) CFLAGS = -W -Wall $(CRELEASE) #LDFLAGS = $(LDDEBUG) LDFLAGS = $(LDRELEASE) LIBS = -lz -lm ... |
在Cygwin或Linux命令列方式進入libpng-1.2.33目錄,輸入: make
即可成功編譯libpng,得到時的靜態庫libpng.a及可執行檔 pngtest。
用 emulator -noskin 命令啟動 Android
模擬器,將pngtest上傳到模擬器,即可測試pngtest:
$adb shell mkdir /dev/sample $adb push pngtest /dev/sample $adb push pngtest.png /dev/sample $adb shell chmod 777 /dev/sample/pngtest $adb shell #cd /dev/sample #./pngtest pngtest.png Testing libpng version 1.2.33 with zlib version 1.2.3 libpng version 1.2.33 - October 31, 2008 Copyright (c) 1998-2008 Glenn Randers-Pehrson Copyright (c) 1996-1997 Andreas Dilger Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. library (10233): libpng version 1.2.33 - October 31, 2008 pngtest (10233): libpng version 1.2.33 - October 31, 2008 sizeof(png_struct)=984, sizeof(png_info)=288 Testing pngtest.png: Pass 0: rwrwrwrwrwrwrwrwrw Pass 1: rwrwrwrwrwrwrwrwrw Pass 2: rwrwrwrwrwrwrwrw Pass 3: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw Pass 4: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw Pass 5: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw rwrwrwrw Pass 6: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw rwrwrwrwrw PASS (9782 zero samples) Filter 0 was used 21 times Filter 1 was used 15 times Filter 2 was used 52 times Filter 3 was used 10 times Filter 4 was used 33 times tIME = 7 Jun 1996 17:58:08 +0000 libpng passes test |
其中"$"為cygwin的命令提示字元,"#"為 adb shell的命令提示字元,測試如所示: