- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我在一个已经可见的窗口中将图像加载到 QLabel 中时,我收到一个消息框:“Python 已停止工作”。选择调试显示:Python.exe 中出现未处理的 Win32 异常。
如果我在显示窗口之前将图像加载到标签中,它会正确显示。
这是精简代码:
#!/usr/bin/etc python
import sys
import os
import stat
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PIL import *
from PIL.ImageQt import *
def update(label):
filename = r"C:\Users\me\Pictures\images\00000229.jpg"
im1 = Image.open(filename)
print ("Read ({},{})".format(im1.width, im1.height))
im2 = im1.rotate(90, expand=True)
print("Rotate ({},{})".format(im2.width, im2.height))
im2.thumbnail((1200,1200))
print("Thumbnail({},{})".format(im2.width, im2.height))
qimage = ImageQt(im2)
pixmap = QPixmap.fromImage(qimage)
label.setPixmap(pixmap)
app = QApplication(sys.argv)
desktop = QDesktopWidget()
deskGeometry = desktop.availableGeometry()
print("desktop ({},{})".format(deskGeometry.width(), deskGeometry.height()))
window = QFrame()
# If you let QT pick the sizes itself, it picks dumb ones, then complains
# 'cause they are dumb
window.setMinimumSize(300, 200)
window.setMaximumSize(deskGeometry.width(), deskGeometry.height())
label = QLabel()
#call update here: no crash
caption = QLabel()
caption.setText("Hello world")
box = QVBoxLayout()
box.addWidget(label)
box.addWidget(caption)
#call update here, no crash
window.setLayout(box)
#call update here, no crash
window.show()
#this call to update results in a crash
update(label)
#window.updateGeometry()
print("App: exec")
app.exec_()
输出:
desktop (3623,2160)
Read (1515,1051)
Rotate (1051,1515)
Thumbnail(832,1200)
App: exec
我是否需要做任何特别的事情来告诉 QT 窗口大小将发生变化?从这里诊断问题的任何建议...
更新:
如果我复制更新函数的主体并将其粘贴到更新调用的位置,它不会长时间崩溃——它会按预期工作。
由此我得出结论,存在对象生命周期问题。 QT 和/或 Pillow 在幕后某处保留指向内部缓冲区的指针,而不是复制或“窃取”缓冲区。当包含缓冲区的对象被删除时,指针变得无效并且“Bad Things Happen[TM]”
现在确定谁在偷懒......
最佳答案
我根据更新中提到的观察结果找到了解决方案,这似乎是一个对象生命周期问题。
更改 update
函数中的行
pixmap = QPixmap.fromImage(qimage)
到
pixmap = QPixmap.fromImage(qimage).copy()
强制复制像素图。这个副本显然有自己的数据缓冲区,而不是从图像中借用缓冲区。
标签然后保持对像素图的引用——确保缓冲区的生命周期。 “错误”似乎是 QPixmap.fromImage 捕获了指向图像中数据的指针,但没有保留对图像的引用,因此如果图像被垃圾收集(这可能是因为它是一个大对象,标签(和像素图)有一个指向未分配内存的指针。
[这个“指向缓冲区的指针”的东西纯粹是我的猜测,但最重要的是程序不再崩溃。]
关于python-3.x - Python3 + Pillow + QT5 : Crash when I resize a label containing an image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40356441/
我正在用 Django 开发一个图片 uploader 。图片上传并保存到磁盘后,我正在尝试调整已保存图像的大小,同时保持其纵横比。我正在使用 Pillow 进行图像处理/调整大小。当我尝试调整图像大
我安装了 Pillow 包: python -m pip install pillow 得到成功消息(成功安装枕头)。关闭并重新打开终端。 但是当我尝试: import pillow 我收到错误消息:
当我运行 python manage.py runserver ,一切开始都很好,但后来我得到一个 SystemCheckError说明 Pillow 未安装;但是,这台机器上肯定安装了 Pillow
这个问题可能已经被问过好几次了,但我无法解决这个错误。我的 M1 Mac 上安装了 pillow、imageio 和其他库。但是,当我在代码下方运行时,仍然出现错误。 注意:我使用 miniforge
我正在遵循这个 SageMaker 指南并使用 1.12 cpu docker 文件。 https://github.com/aws/sagemaker-tensorflow-serving-cont
前言 Pillow作为一个图片模块。可谓是真的简便强大,它的前身是PIL,后来将他取代,现在的pillow 可谓是一家独大,好了,让我们来看看他的具体用法。 今天我们介绍pi
我想对 png 图像进行二值化。如果可能的话,我想使用 Pillow。我见过两种使用方法: image_file = Image.open("convert_image.png") # open co
我正在尝试使用 Pillow 为一些乌尔都语文本生成图像。使用相同的代码生成普通英语就像一个魅力,但当我对乌尔都语文本做同样的事情时,事情就不会那么顺利了。 以下是使用英语完成的代码和结果: from
美好的一天。 在我的工作中,有时我必须使用脚本从数字或 ID 中获取一些信息。就像下面的例子: 我使用的脚本: $sh script.sh 9999999999999 abc 出现在屏幕上的信息
我正在使用 Pillow 3.1.1 图像库和 Python 3.5.1。 我正在尝试使用 Pillow 在图像上绘制字体。但结果看起来绝对丑陋且 Not Acceptable 。 第一个例子:看起来
我希望给定目录中的所有图片都具有相同的大小。这就是我所拥有的: import PIL import os import math from PIL import Image dirPath = r"C
我正在尝试在我的服务器上重新安装 Pillow,我得到了这个: ... Proceed (y/n)? y Successfully uninstalled Pillow-4.0.0 (myproj
为什么我可以使用 ImageGrab.grab(300,200,400,150) 而不是这个:ImageGrab.grab(bbox)? 代码和错误消息: def wl(wx,wy): loc
我正在尝试使用pillow (pil) 来降低图像的文件大小,但是降低图像质量并不会降低保存图像的大小。保存的图像“image2”和“image3”大小相同。 import PIL from Imag
我需要沿着一条线获取像素值,我使用的是 Python3 和 Pillow。在 opencv 中有这样的东西 LineIterator这将返回两点之间所有适当的像素,但我在 Pillow 的文档中没有找
我有一张图片,我想将它转置 30 度。是否可以使用类似的东西 spinPicture003 = Picture003.transpose(Image.Rotate_30) 最佳答案 要绕其中心逆时针
opencv > pil ? 1
Image 对象有一些常用的基本属性,这些属性能够帮助我们了解图片的基本信息,下面对这些属性做简单的讲解: 1) size:查看图像的尺寸 from PIL import Image im = Im
我运行了以下命令将项目依赖项安装到 virtualenv novacek 中: (novacek) $ pip install -r reqs.txt reqs.txt 看起来像这样: Django=
我可以使用以下代码在基本图像上绘制黑色 strip (或矩形): base_width, base_height = img.size background = Image.new('RGBA', (
我是一名优秀的程序员,十分优秀!