无需重建APK:Kivy Launcher添加PIL遇_imaging导入报错求方案
解决PIL导入报错及Android截图替代方案
报错根源
_imaging是Pillow(PIL的现代分支)的底层C扩展模块,你手动放置的PIL文件夹只有纯Python代码,缺少适配Android arm64-v8a架构、Python3.11版本编译的.so二进制文件,导致导入失败。另外,ImageGrab是桌面系统专属的API,在Android上原生无法运行,即使解决模块问题也无法正常使用。
无需重建APK的解决步骤
1. 补全Pillow的扩展二进制文件
- 准备适配文件:
- 用Buildozer创建一个仅依赖Pillow的测试项目,编译生成APK后,解压APK并从
assets/python/lib/python3.11/site-packages/PIL/目录中提取所有.so后缀的文件(例如_imaging.cpython-311.so、_imagingft.cpython-311.so等)。
- 用Buildozer创建一个仅依赖Pillow的测试项目,编译生成APK后,解压APK并从
- 复制文件到设备:
- 将这些
.so文件拷贝到你设备上的/storage/emulated/0/kivy/PIL/目录,与__init__.py放在同一层级。
- 将这些
2. 替换ImageGrab为Android兼容的截图代码
直接使用Kivy原生的截图API替代ImageGrab,基础示例代码:
from kivy.core.window import Window # 截取整个窗口并保存为图片 Window.screenshot(name='my_screenshot.png')
如果需要截取指定区域,可结合Kivy的Texture组件实现,示例:
from kivy.core.window import Window import numpy as np from PIL import Image # 获取窗口纹理并截取指定区域(x, y, 宽度, 高度) texture = Window.screen.texture region = texture.get_region(100, 100, 500, 500) # 转换为可处理的像素数组 pixels = np.frombuffer(region.pixels, dtype=np.uint8).reshape(region.height, region.width, 4) # 保存为图片 img = Image.fromarray(pixels) img.save('region_screenshot.png')
内容的提问来源于stack exchange,提问作者大橋和季
相关产品推荐
相关产品推荐

