【问题标题】:Python: TIFFReadDirectory warning: unknown field with tagPython:TIFFReadDirectory 警告:带有标签的未知字段
【发布时间】:2019-10-08 01:36:14
【问题描述】:

问题
我可以在 kivy 中使用Image() 模块加载图片。 This 是我安装 kivy 以便查看 TIFF 文件的方法。但是现在每次加载 TIFF 图像时,我都会收到一个接一个的弹出警告,从而中断程序。

TIFFReadDirectory warning:
unknown field with tag 18246 (0x4746)
TIFFReadDirectory warning:
unknown field with tag 18249 (0x4749)
TIFFReadDirectory warning:
unknown field with tag 20752 (0x5110)
TIFFReadDirectory warning:
unknown field with tag 20753 (0x5111)
TIFFReadDirectory warning:
unknown field with tag 20754 (0x5112)
TIFFReadDirectory warning:
unknown field with tag 40092 (0x9c9c)
TIFFReadDirectory warning:
unknown field with tag 40093 (0x9c9d)
TIFFReadDirectory warning:
unknown field with tag 40094 (0x9c9e)

为了澄清,这些警告都没有出现在 python 日志中。这些都是在我的程序显示 TIFF 文件之前出现的单独警告框。我听说一个名为 libtiff 的库往往会导致这个问题。

代码

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivy.uix.image import Image

class ContainerBox(BoxLayout):
    def __init__(self, **kwargs):
        super(ContainerBox, self).__init__(**kwargs)
        self.orientation = 'vertical'
        self.picture = Image(allow_stretch=True, source='..\pics\snorlax.tif')
        Clock.schedule_once(lambda dt: self.add_widget(self.picture), timeout=0.1)


class SimpleImage(App):
    def build(self):
        return ContainerBox()

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

技术细节

  • 图片可以通过here下载。
  • 我已经修改了这个文件的 exif 数据。我可能在文件中添加了几个非标准标签。但是我对 jpg 文件和 png 文件做了同样的事情。这些并没有导致像这样烦人的弹出窗口。
  • 我使用的是 Kivy 1.11.1 版
  • 根据 Anaconda 的说法,虚拟环境正在运行 Python 3.5.6
  • 我在 Windows 7 上通过 PyCharm 运行它
  • 这些是来自 python 日志的详细信息:
[INFO   ] [deps        ] Successfully imported "kivy_deps.glew" 0.1.12
[INFO   ] [deps        ] Successfully imported "kivy_deps.sdl2" 0.1.22
[INFO   ] [Kivy        ] v1.11.1
[INFO   ] [Kivy        ] Installed at "C:\Users\H\venvs\env1\lib\site-packages\kivy\__init__.py"
[INFO   ] [Python      ] v3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)]
[INFO   ] [Python      ] Interpreter at "C:\Users\H\venvs\env1\Scripts\python.exe"
[INFO   ] [Factory     ] 184 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_gif (img_pil, img_ffpyplayer ignored)
[INFO   ] [Loader      ] using a thread pool of 2 workers
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [Window      ] Provider: sdl2
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] Backend used <sdl2>
[INFO   ] [GL          ] OpenGL version <b'4.0.0 - Build 9.18.10.3204'>
[INFO   ] [GL          ] OpenGL vendor <b'Intel'>
[INFO   ] [GL          ] OpenGL renderer <b'Intel(R) HD Graphics 4600'>
[INFO   ] [GL          ] OpenGL parsed version: 4, 0
[INFO   ] [GL          ] Shading version <b'4.00 - Build 9.18.10.3204'>
[INFO   ] [GL          ] Texture max size <8192>
[INFO   ] [GL          ] Texture max units <16>
[INFO   ] [Window      ] auto add sdl2 input provider

我的问题
是否可以抑制这些警告?我认为它们是由一些图书馆 kivy 调用的。它甚至可能是我无法编辑的预编译代码。
我花了很长时间用 Kivy 制作复杂的用户界面。我真的不想丢掉所有这些工作。但我可能愿意将它迁移到 c++,理论上我可以控制更多代码。这有必要甚至可能吗?

【问题讨论】:

  • 尝试使用ctypes加载Kivy自带的libtiff DLL并调用TIFFSetWarningHandler(0)
  • @cgohlke 绝对有效。我不知道你能做到这一点。我将添加我所做的作为答案,但如果您将其作为一个答案提交,我将接受它作为官方答案。

标签: python python-3.x kivy tiff libtiff


【解决方案1】:

在脚本的开头,我添加了

import ctypes

libbytiff = ctypes.CDLL("libtiff-5.dll")
libbytiff.TIFFSetWarningHandler.argtypes = [ctypes.c_void_p]
libbytiff.TIFFSetWarningHandler.restype = ctypes.c_void_p
libbytiff.TIFFSetWarningHandler(None)

警告停止了。

【讨论】:

  • 由于 TIFFSetWarningHandler 处理指针(不是 C int),因此定义参数和返回类型会更安全,例如libbytiff.TIFFSetWarningHandler.argtypes = [ctypes.c_void_p]libbytiff.TIFFSetWarningHandler.restype = ctypes.c_void_p 在调用 libbytiff.TIFFSetWarningHandler(None) 之前(未测试)。
  • 我对此进行了测试,它确实有效。所以我编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 2021-06-02
  • 2018-02-24
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 2016-03-05
相关资源
最近更新 更多