【问题标题】:Kivy: Allow User to modify imagesKivy:允许用户修改图像
【发布时间】:2017-12-22 21:26:26
【问题描述】:

我想让用户通过我的 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)

试过

【问题讨论】:

  • 您建议的方法有什么问题?
  • 我已经更新了上面问题的描述。最终,我看不到如何将 StringIO/ImageLoaderPyGame 与我的应用程序显示的图像一起使用,该图像是通过文件路径定义的。

标签: python kivy python-imaging-library


【解决方案1】:

Python Kivy 在图像处理方面严重滞后,主要是因为存在多个严重错误和糟糕的解决方案。
它不是为此类任务创建的,也不应用于创建像图像编辑器这样的东西。
所以,我想出了这个(肮脏的)解决方案。

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 以及所有其他此类兼容性库都非常有问题。
p.s.你也可以看到this

【讨论】:

  • 没有理由不能在 Kivy 中制作一个性能良好的图像编辑器。
  • 是的,但这不是这个任务的好选择。简单证明:Kivy 文档中没有图像处理示例(Scatter 除外)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多