Kivy:允许用户修改图像

时间:2017-12-22 21:26:26

标签: python kivy python-imaging-library

我希望允许用户通过我的kivy应用中的滑块调整图像的对比度。因为我想实时修改和更新当前图像。我正在努力在Kivy实施。

从研究问题开始,我想我应该使用StringIO和/或ImageLoaderPyGame(本文底部列出了这些资源)。问题是我对如何将其与我的kv文件联系起来感到困惑,以及如何使用我当前的图像正确实现StringIO和ImageLoaderPyGame。一些描述我试图做的伪代码是:

Slider :
    id: contrast
    value: 100
    min: 0
    max: 199
    on_value: root.update_contrast(contrast.value)

Image :
    id: displayed_image
    source: root.display_path

Python代码:

def update_contrast(self, value):
        buff = StringIO(self.display_image)
        buff.seek(0)
        img = ImageLoaderPygame(buff)
        self.display_image = self.change_contrast(img, value)

出现以下错误:

buff = StringIO(self.display_image)
TypeError: initial_value must be str or None, not numpy.ndarray

我理解的意思是我需要使用None或字符串启动StringIO对象,但我对如何合并当前显示图像(通过文件路径变量定义 - 我也无法用来实例化)感到困惑StringIO,我得到了仍然可以理解的错误 - "路径应该是字符串,字节,os.PathLike或整数,而不是_io.StringIO")

摘要 目前,我有一个显示图像对象,通过用户指定的文件路径(kv图像标签需要显示图像)定义。我不知道如何让用户有效地调整显示图像的对比度。我想我需要使用StringIO和ImageLoaderPyGame,但我不知道如何将文件路径和StringIO / ImageLoaderPyGame绑在一起。

注意:change_contrast类似于此处建议的方法:Change contrast of image in PIL

def change_contrast(img, level):
    factor = (259 * (level + 255)) / (255 * (259 - level))
    def contrast(c):
        return 128 + factor * (c - 128)
    return img.point(contrast)

试过

1 个答案:

答案 0 :(得分:-1)

Python Kivy严重滞后于Image Manipulations,主要是因为多个关键错误和糟糕的解决方案 它不是为此类任务创建的,不应用于创建图像编辑器之类的东西 所以,我提出了这个(肮脏的)解决方案。

from kivy.app import App
from kivy.uix.widget import Widget
from PIL import Image

class PongGame(Widget):
    c_image_path = '1.png'

    def update_contrast(self, cvalue):
        c_image = Image.open(self.c_image_path)
        self.change_contrast(c_image, self.ids.contrast.value)
        c_image.save('temp_' + self.c_image_path, 'PNG');

        self.ids.displayed_image.source = 'temp_' + self.c_image_path

    def change_contrast(self, img, level):
        factor = (259 * (level + 255)) / (255 * (259 - level))
        def contrast(c):
            return 128 + factor * (c - 128)
        return img.point(contrast)

class PongApp(App):
    def build(self):
        game = PongGame()
        return game


if __name__ == '__main__':
    PongApp().run()

试图实现内存中的操作,但ImageLoaderPIL非常小,以及所有其他类似的兼容库。
附:您也可以看到this