Pillow/Tests/test_qt_image_qapplication.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

85 lines
2.5 KiB
Python
Raw Normal View History

from __future__ import annotations
2024-01-20 14:23:03 +03:00
from pathlib import Path
2021-01-01 03:33:20 +03:00
import pytest
2024-02-20 07:41:20 +03:00
from PIL import Image, ImageQt
2021-01-01 03:33:20 +03:00
2023-01-28 06:15:51 +03:00
from .helper import assert_image_equal_tofile, assert_image_similar, hopper
2021-01-01 03:33:20 +03:00
if ImageQt.qt_is_installed:
from PIL.ImageQt import QPixmap
2021-02-10 13:12:30 +03:00
if ImageQt.qt_version == "6":
2021-03-10 05:17:19 +03:00
from PyQt6.QtCore import QPoint
from PyQt6.QtGui import QImage, QPainter, QRegion
2021-02-10 13:12:30 +03:00
from PyQt6.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget
elif ImageQt.qt_version == "side6":
2021-03-10 05:17:19 +03:00
from PySide6.QtCore import QPoint
from PySide6.QtGui import QImage, QPainter, QRegion
2020-12-28 13:58:08 +03:00
from PySide6.QtWidgets import QApplication, QHBoxLayout, QLabel, QWidget
2021-01-01 03:33:20 +03:00
class Example(QWidget):
def __init__(self) -> None:
2021-01-01 03:33:20 +03:00
super().__init__()
img = hopper().resize((1000, 1000))
qimage = ImageQt.ImageQt(img)
2020-12-28 14:04:25 +03:00
pixmap1 = ImageQt.QPixmap.fromImage(qimage)
2021-01-01 03:33:20 +03:00
QHBoxLayout(self) # hbox
lbl = QLabel(self)
# Segfault in the problem
lbl.setPixmap(pixmap1.copy())
2024-02-20 07:41:20 +03:00
def roundtrip(expected: Image.Image) -> None:
2021-01-01 03:33:20 +03:00
result = ImageQt.fromqpixmap(ImageQt.toqpixmap(expected))
# Qt saves all pixmaps as rgb
2023-02-24 00:39:48 +03:00
assert_image_similar(result, expected.convert("RGB"), 1)
2021-01-01 03:33:20 +03:00
@pytest.mark.skipif(not ImageQt.qt_is_installed, reason="Qt bindings are not installed")
def test_sanity(tmp_path: Path) -> None:
2021-01-01 03:33:20 +03:00
# Segfault test
app = QApplication([])
ex = Example()
assert app # Silence warning
assert ex # Silence warning
for mode in ("1", "RGB", "RGBA", "L", "P"):
# to QPixmap
2021-03-10 05:17:19 +03:00
im = hopper(mode)
data = ImageQt.toqpixmap(im)
2021-01-01 03:33:20 +03:00
assert isinstance(data, QPixmap)
assert not data.isNull()
# Test saving the file
tempfile = str(tmp_path / f"temp_{mode}.png")
data.save(tempfile)
2021-03-10 05:17:19 +03:00
# Render the image
qimage = ImageQt.ImageQt(im)
data = QPixmap.fromImage(qimage)
qt_format = QImage.Format if ImageQt.qt_version == "6" else QImage
qimage = QImage(128, 128, qt_format.Format_ARGB32)
painter = QPainter(qimage)
image_label = QLabel()
image_label.setPixmap(data)
image_label.render(painter, QPoint(0, 0), QRegion(0, 0, 128, 128))
painter.end()
rendered_tempfile = str(tmp_path / f"temp_rendered_{mode}.png")
qimage.save(rendered_tempfile)
assert_image_equal_tofile(im.convert("RGBA"), rendered_tempfile)
2021-01-01 03:33:20 +03:00
# from QPixmap
roundtrip(hopper(mode))
app.quit()
app = None