【问题标题】:Tkinter canvas scaling causing image to blurTkinter 画布缩放导致图像模糊
【发布时间】:2021-06-18 03:42:35
【问题描述】:

我已经实现了一个带有缩放功能的 Tkinter 画布对象,在另一个堆栈交换帖子之后进行了一些修改。功能是:

  def wheel(self, event):
      ''' Zoom with mouse wheel '''
      scale = 1.0
      if self.imscale > 6 and event.delta == 120:
        return
      # Respond to Linux (event.num) or Windows (event.delta) wheel event
      if event.delta == -120:
          scale        -= .5
          self.imscale -= .5
      if event.delta == 120:
          scale        += .5
          self.imscale += .5
      # Rescale all canvas objects
      x = self.canvas.canvasx(event.x)
      y = self.canvas.canvasy(event.y)
      self.canvas.scale('all', x, y, scale, scale)
      self.show_image()
      self.canvas.configure(scrollregion=self.canvas.bbox('all'))

  def show_image(self):
      ''' Show image on the Canvas '''
      if self.imageid:
          self.canvas.delete(self.imageid)
          self.imageid = None
          self.canvas.imagetk = None  # delete previous image from the canvas
      width, height = self.image.size
      new_size = int(self.imscale * width), int(self.imscale * height)
      imagetk = ImageTk.PhotoImage(self.image.resize(new_size))
      # Use self.text object to set proper coordinates
      self.imageid = self.canvas.create_image(self.canvas.coords(self.text),
                                              anchor='nw', image=imagetk)
      self.canvas.lower(self.imageid)  # set it into background
      self.canvas.imagetk = imagetk  # keep an extra reference to prevent garbage-collection

但是,当使用此缩放功能时,有问题的图像会模糊,尽管它是不应该模糊的像素艺术图像?发生。

我环顾四周,发现提到了 windll.shcore.SetProcessDpiAwareness(1) 作为一种可能的解决方案,但我将它添加到我的脚本中并没有任何改变。

我附上了模糊的 tkinter 缩放图像的图片,以及使用 MS Paint 放大的“真实”图片。

任何帮助将不胜感激!我会〜宁愿〜不必离开 Tkinter,但如果没有其他可能的解决方案,我可以。

【问题讨论】:

  • imagetk = ImageTk.PhotoImage(self.image.resize(new_size), Image.ANTIALIAS) 尝试使用它,看看它是否变得更好
  • @AbhishekAggarwal 试过了——似乎根本没有改善模糊度。
  • @AbhishekAggarwal 不过,你带领我走上了正确的道路 - 请参阅我发布的答案!

标签: python tkinter scale tkinter-canvas


【解决方案1】:

啊,在 cmets 的 Abhishek Aggarwal 的帮助下回答了我自己的问题! ANTIALIAS 不能用作重采样过滤器,但我尝试了 NEAREST 并完全解决了它。

谢谢!

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多