我希望允许用户通过我的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)
试过
答案 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