为android编译python的图像库pillow
2017-03-11 22:42
134 查看
Pillow是python的图像处理库,可以从github下载。pillow中部分代码使用C编写,如果需要在android环境中使用,则需要编译为android的共享库。编译过程与编译环境相关,这里使用redhat
7.0,已经安装了python 2.7,android的ndk。
Pillow使用了jpeg, png, freetype库,首先需要编译它们为静态库.
打补丁:patch -p0 -i pillow-master.android.patch,
Pillow版本不同可能需要修改补丁,可参照修改
编译需要python头文件,下载starcore_for_android,解压到pillow同级目录
使用python2.7编译,首先设置交叉编译环境
运行python setup.py build
编译结果在
Pillow-master/build/lib.linux-x86_64-2.7
将PIL打包成zip,既可以在android应用中使用
studio
将PIL.zip放到assets目录,在app中将其解压到"/data/data/"+getPackageName()+"/files"。
在assets中创建test.py,在app中将test.py拷贝到"/data/data/"+getPackageName()+"/files"。
加载test.py
关于android中使用python,请参考之前的文章
示例下载
7.0,已经安装了python 2.7,android的ndk。
Pillow使用了jpeg, png, freetype库,首先需要编译它们为静态库.
1.编译jpeg,png,freetype为静态库
jpeg使用版本jpegsrc.v9b;png使用版本libpng-1.6.26a.首先设置交叉编译环境
export ANDROID_NDK="/usr/local/android/android-ndk-r10d" export PATH="$ANDROID_NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/:$ANDROID_NDK:$ANDROID_NDK/tools:/usr/local/bin:/usr/bin:/bin:$PATH" export ARCH="armeabi" export CFLAGS="-DANDROID -mandroid -fomit-frame-pointer --sysroot=$ANDROID_NDK/platforms/android-9/arch-arm" export CXXFLAGS="$CFLAGS" export CC="arm-linux-androideabi-gcc $CFLAGS" export CXX="arm-linux-androideabi-g++ $CXXFLAGS" export AR="arm-linux-androideabi-ar" export RANLIB="arm-linux-androideabi-ranlib" export STRIP="arm-linux-androideabi-strip --strip-unneeded" export READELF="arm-linux-androideabi-readelf" export MAKE="make -j4 CROSS_COMPILE_TARGET=yes" export LAPACK=
b. 编译jpeg
解压jpegsrc.v9b.tar.gz./configure LDFLAGS="-llog -lm" CFLAGS="-mandroid -fomit-frame-pointer -Wno-format" --disable-shared --host=arm-linux --build=i686-pc-linux-gnu --prefix="/usr/local/android/install/jpeg9b.armeabi" make make install
c. 编译png
解压libpng-1.6.26.tar.gz./configure LDFLAGS="-llog -lm" CFLAGS="-mandroid -fomit-frame-pointer -Wno-format" --disable-shared --host=arm-linux --build=i686-pc-linux-gnu --prefix="/usr/local/android/install/libpng1626.armeabi" make make install
d. 编译freetype
解压freetype-2.6.5.tar.gz./configure LDFLAGS="-llog -lm" LIBPNG_LIBS="-L/usr/local/android/install/libpng1626.armeabi/lib" CFLAGS="-mandroid -fomit-frame-pointer -Wno-format" LIBPNG_CFLAGS="-I/usr/local/android/install/libpng1626.armeabi/include" --disable-shared --host=arm-linux --build=i686-pc-linux-gnu --prefix="/usr/local/android/install/freetype265.armeabi" make make install
2. 编译pillow
从github下载pillow,解压Pillow-master.zip打补丁:patch -p0 -i pillow-master.android.patch,
Pillow版本不同可能需要修改补丁,可参照修改
diff -ruN ../version/Pillow-master/setup.py Pillow-master/setup.py --- ../version/Pillow-master/setup.py 2016-11-02 01:10:30.000000000 +0800 +++ Pillow-master/setup.py 2016-11-03 20:27:54.905900300 +0800 @@ -182,6 +182,7 @@ library_dirs = [] include_dirs = [] + self.compiler.linker_so[0] = os.environ.get('CC') _add_directory(include_dirs, "libImaging") # @@ -380,7 +381,9 @@ # between Python PYD stub libs and real libraries self.compiler.library_dirs = library_dirs + self.compiler.library_dirs - self.compiler.include_dirs = include_dirs + self.compiler.include_dirs + self.compiler.include_dirs = include_dirs # + self.compiler.include_dirs + self.compiler.include_dirs.remove('/usr/local/include') + self.compiler.include_dirs.remove('/usr/include') # # look for available libraries @@ -395,7 +398,8 @@ elif (sys.platform == "win32" and _find_library_file(self, "zlib")): feature.zlib = "zlib" # alternative name - + feature.zlib = "z" #==================== + if feature.want('jpeg'): _dbg('Looking for jpeg') if _find_include_file(self, "jpeglib.h"): @@ -559,7 +563,7 @@ exts = [(Extension("PIL._imaging", files, libraries=libs, - define_macros=defs))] + define_macros=defs,extra_link_args = ['-Wl,-soname,_imaging.so']))] # # additional libraries @@ -567,7 +571,7 @@ if feature.freetype: exts.append(Extension("PIL._imagingft", ["_imagingft.c"], - libraries=["freetype"])) + libraries=["freetype","png"],extra_link_args = ['-Wl,-soname,_imagingft.so'])) if feature.lcms: extra = [] @@ -575,7 +579,7 @@ extra.extend(["user32", "gdi32"]) exts.append(Extension("PIL._imagingcms", ["_imagingcms.c"], - libraries=[feature.lcms] + extra)) + libraries=[feature.lcms] + extra,extra_link_args = ['-Wl,-soname,_imagingcms.so'])) if feature.webp: libs = [feature.webp] @@ -589,7 +593,7 @@ exts.append(Extension("PIL._webp", ["_webp.c"], libraries=libs, - define_macros=defs)) + define_macros=defs,extra_link_args = ['-Wl,-soname,_webp.so'])) tk_libs = ['psapi'] if sys.platform == 'win32' else [] exts.append(Extension("PIL._imagingtk", @@ -597,8 +601,8 @@ include_dirs=['Tk'], libraries=tk_libs)) - exts.append(Extension("PIL._imagingmath", ["_imagingmath.c"])) - exts.append(Extension("PIL._imagingmorph", ["_imagingmorph.c"])) + exts.append(Extension("PIL._imagingmath", ["_imagingmath.c"],extra_link_args = ['-Wl,-soname,_imagingmath.so'])) + exts.append(Extension("PIL._imagingmorph", ["_imagingmorph.c"],extra_link_args = ['-Wl,-soname,_imagingmorph.so'])) self.extensions[:] = exts
编译需要python头文件,下载starcore_for_android,解压到pillow同级目录
使用python2.7编译,首先设置交叉编译环境
export ANDROID_NDK="/usr/local/android/android-ndk-r10d" export PATH="$ANDROID_NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/:$ANDROID_NDK:$ANDROID_NDK/tools:/usr/local/bin:/usr/bin:/bin:$PATH" export ARCH="armeabi" export CFLAGS="-DANDROID -mandroid -fomit-frame-pointer --sysroot=$ANDROID_NDK/platforms/android-9/arch-arm -I../starcore_for_android.2.5.1/python.files/python-2.7/armeabi/include/python2.7 -I/usr/local/android/install/jpeg9b.armeabi/include -I/usr/local/android/install/freetype265.armeabi/include" export CXXFLAGS="$CFLAGS" export CC="arm-linux-androideabi-gcc" export LDFLAGS="-lm -L../starcore_for_android.2.5.1/python.files/python-2.7/armeabi -L/usr/local/android/install/jpeg9b.armeabi/lib -L/usr/local/android/install/freetype265.armeabi/lib -L/usr/local/android/install/libpng1626.armeabi/lib" export CXX="arm-linux-androideabi-g++" export AR="arm-linux-androideabi-ar" export RANLIB="arm-linux-androideabi-ranlib" export STRIP="arm-linux-androideabi-strip --strip-unneeded" export READELF="arm-linux-androideabi-readelf" export MAKE="make -j4 CROSS_COMPILE_TARGET=yes" export LAPACK=
运行python setup.py build
编译结果在
Pillow-master/build/lib.linux-x86_64-2.7
将PIL打包成zip,既可以在android应用中使用
3.测试pillow
测试使用eclipse开发,可以导入到androidstudio
将PIL.zip放到assets目录,在app中将其解压到"/data/data/"+getPackageName()+"/files"。
在assets中创建test.py,在app中将test.py拷贝到"/data/data/"+getPackageName()+"/files"。
import os, sys import traceback try: from PIL import Image print(Image) print(AppPath) im=Image.open(AppPath+"/dir.jpg") print(im.size) print(im.mode) print("===end===") except Exception,e: traceback.print_exc()
加载test.py
python._Set("AppPath", "/data/data/"+getPackageName()+"/files"); Service._DoFile("python", "/data/data/"+getPackageName()+"/files/test.py", "");
关于android中使用python,请参考之前的文章
示例下载
相关文章推荐
- 为ios编译python的图像库pillow
- python 自动操作 android源码编译某一个apk
- Mac OS X 10.8.3搭建Android工程源码的编译环境(解决找不到GCC、GIT、PYTHON的问题)
- 在android上编译和运行python版的tensorflow
- 随手写的自动批量编译部署NativeAndroid程序Python脚本
- python—android编译中build_image.py分析
- 拥抱Android:编译python搭建移动的无线服务器平台
- 在Mac上安装编译OpenCV (for Cpp / Java / Android / Python)
- 批量反编译Android XML文件Python脚本
- 拥抱Android:编译python搭建移动的无线服务器平台
- android编译导入cocos2dx项目后提示python NDK_ROOT not defined
- cocos2d-x-3.0beta使用Python 创建Cocos2d-x 项目和编译Android 项目
- 编译 python 生成静态库 libpython2.7.so
- Android下编译FFmpeg(添加Androidmk)
- android直接找一个文件,部分编译等实用
- android 编译 app
- Android逆向助手反编译APK
- Android编译服务器的管理之二:管理用户
- 编译和安装BusyBox到Android手机
- python: android批量多渠道打包