You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kivy显示Android存储图片时出现黑方块问题排查

解决Kivy在Android上无法显示高分辨率拍摄图片的问题

嘿,我帮你分析下这个问题!你遇到的黑方块情况,结合“应用内小图正常、拍摄的高分辨率图不行”这个现象,大概率是内存限制或者外部存储权限/加载逻辑的问题,下面给你逐个排查和解决:

1. 最可能原因:高分辨率图片导致内存不足

Android应用的内存配额有限,Kivy加载大尺寸图片时,很容易因为内存不够而无法渲染,只会显示黑块,而且通常不会抛出明显报错(这是Kivy处理图片时的常见情况)。

解决办法:拍摄后自动压缩图片

你可以在拍照完成后,立即对图片进行压缩,降低分辨率和文件大小,这样Kivy就能正常加载了。这里用Pillow库来处理:

首先,确保你的项目里安装了Pillow(在buildozer.spec里添加requirements = python3,kivy,pillow)。然后修改你的take_shot方法:

from PIL import Image
import os

def take_shot(self, name, when):
    # 定义图片压缩函数
    def compress_image(img_path):
        try:
            with Image.open(img_path) as img:
                # 设置目标最大分辨率,比如1920x1080,你可以根据需求调整
                max_dimension = (1920, 1080)
                img.thumbnail(max_dimension, Image.Resampling.LANCZOS)
                # 覆盖原图片,设置压缩质量(85是平衡画质和大小的常用值)
                img.save(img_path, format="JPEG", quality=85, optimize=True)
        except Exception as e:
            print(f"压缩图片出错: {e}")

    # 拍照后的回调函数,先压缩再执行原done逻辑
    def post_shot_callback(_):
        if when == 'before':
            compress_image(self.before)
        else:
            compress_image(self.after)
        self.done(when)()  # 调用你原来的done回调

    if when == 'before':
        self.before = '/storage/emulated/0/Kalkulator/' + name + when + '.jpg'
        camera.take_picture(self.before, post_shot_callback)
    elif when == 'after':
        self.after = '/storage/emulated/0/Kalkulator/' + name + when + '.jpg'
        camera.take_picture(self.after, post_shot_callback)

2. 外部存储权限验证

虽然你能保存图片到外部存储,但加载时可能因为Android的权限机制限制导致无法读取:

  • 对于Android 9及以下,需要申请READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限;
  • 对于Android 10+,如果使用传统路径(如/storage/emulated/0/Kalkulator/),需要申请MANAGE_EXTERNAL_STORAGE权限,或者改用MediaStore API来访问文件。

权限配置步骤:

  1. buildozer.spec里添加权限:
android.permissions = READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,MANAGE_EXTERNAL_STORAGE
  1. 在Python代码启动时请求权限:
from kivy.utils import platform
if platform == 'android':
    from android.permissions import request_permissions, Permission
    request_permissions([
        Permission.READ_EXTERNAL_STORAGE,
        Permission.WRITE_EXTERNAL_STORAGE,
        Permission.MANAGE_EXTERNAL_STORAGE
    ])

3. 额外检查点

  • 确认数据库里存储的路径完全正确:可以在加载前打印str(dane[5]),看路径是否和实际文件路径一致,有没有拼写错误、大小写问题;
  • 检查拍摄的图片是否损坏:可以把图片传到电脑上打开,确认图片本身没问题;
  • 尝试调整Image组件的参数:比如添加allow_stretch=True,或者设置nocache=False(不过这个更多是缓存问题,优先级低于前两个解决办法)。

先试试图片压缩的方案,这应该能解决大部分高分辨率图片显示黑块的问题!

内容的提问来源于stack exchange,提问作者Przemek

火山引擎 最新活动