Преобразование QtGui.QImage в черно-белое изображение
Как изображение QtGui.QImage преобразовать в черно-белое изображение?
Ответы (2 шт):
Автор решения: Alexander Chernin
→ Ссылка
size = image.size()
for i in range(size.width()):
for j in range(size.height()):
gray = qGray(image.pixel(i, j))
image.setPixel(i, j, qRgb(gray, gray, gray))
Автор решения: S. Nick
→ Ссылка
Да, все возможно, попробуйте:
from PyQt5 import QtCore, QtGui, QtWidgets
class ImageConverter(QtWidgets.QWidget):
def __init__(self):
super().__init__()
layout = QtWidgets.QGridLayout(self)
openButton = QtWidgets.QPushButton('Open...')
layout.addWidget(openButton, 0, 0)
openButton.clicked.connect(self.openFile)
# отображение меток и их функций
conversions = [
('Original', self.asOriginal),
('Negative', self.toNegative),
('Gray scale', self.toGray),
('Monochrome', self.toMono),
('Horizontal Flip', self.hFlip),
('Vertical Flip', self.vFlip),
('Brightness', self.brightness)
]
self.convertCombo = QtWidgets.QComboBox()
layout.addWidget(self.convertCombo, 0, 1)
for label, func in conversions:
# установить данные каждого элемента в функцию, которая будет изменять
# изображение, тогда мы можем получить доступ к этой функции
# из выбранного в данный момент элемента
self.convertCombo.addItem(label, func)
self.convertCombo.setEnabled(False) # закрыто, пока не выбрана картинка
self.brightnessTimer = QtCore.QTimer(
singleShot=True,
interval=500,
timeout=self.brightness
)
self.brightnessSlider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
layout.addWidget(self.brightnessSlider, 0, 2)
self.brightnessSlider.setEnabled(False)
self.brightnessSlider.setValue(50)
self.brightnessSlider.setRange(0, 100)
# простая метка, показывающая значение яркости
self.brightnessLabel = QtWidgets.QLabel('50 %')
layout.addWidget(self.brightnessLabel, 0, 3)
self.original = QtWidgets.QLabel()
layout.addWidget(self.original, 1, 0)
self.transformed = QtWidgets.QLabel()
layout.addWidget(self.transformed, 1, 1, 1, 3)
# каждый раз, когда элемент выбран,
# вызывайте набор функций в качестве данных элемента,
# чтобы преобразование выполнялось автоматически;
self.convertCombo.currentIndexChanged.connect(
lambda i: self.convertCombo.itemData(i)()
)
# включить ползунок, только если выбран режим яркости
self.convertCombo.currentIndexChanged.connect(
lambda i: self.brightnessSlider.setEnabled(
i == len(conversions) - 1)
)
# не делайте вычисление яркости при каждом изменении значения,
# но только через некоторое время значение изменяется
self.brightnessSlider.valueChanged.connect(
self.brightnessTimer.start)
self.brightnessSlider.valueChanged.connect(
lambda v: self.brightnessLabel.setText('{} %'.format(v)))
def openFile(self):
path, filter = QtWidgets.QFileDialog.getOpenFileName(
self, 'Select image', '')
pixmap = QtGui.QPixmap(path)
if not pixmap.isNull():
self.original.setPixmap(pixmap)
self.convertCombo.setEnabled(True)
self.convertCombo.currentData()()
def asOriginal(self):
self.transformed.setPixmap(self.original.pixmap())
def toNegative(self):
image = self.original.pixmap().toImage()
image.invertPixels()
self.transformed.setPixmap(QtGui.QPixmap.fromImage(image))
def toGray(self):
image = self.original.pixmap().toImage()
transformed = image.convertToFormat(QtGui.QImage.Format_Grayscale8)
self.transformed.setPixmap(QtGui.QPixmap.fromImage(transformed))
def toMono(self):
image = self.original.pixmap().toImage()
transformed = image.convertToFormat(QtGui.QImage.Format_Mono)
self.transformed.setPixmap(QtGui.QPixmap.fromImage(transformed))
def hFlip(self):
image = self.original.pixmap().toImage()
transformed = image.mirrored(horizontal=True, vertical=False)
self.transformed.setPixmap(QtGui.QPixmap.fromImage(transformed))
def vFlip(self):
image = self.original.pixmap().toImage()
transformed = image.mirrored(horizontal=False, vertical=True)
self.transformed.setPixmap(QtGui.QPixmap.fromImage(transformed))
def brightness(self):
image = self.original.pixmap().toImage()
brightness = self.brightnessSlider.value()
if brightness == 50:
# яркость по умолчанию, используйте оригинальное изображение
self.asOriginal()
return
elif brightness < 50:
ratio = brightness / 50
convFunc = lambda l: l * ratio
else:
ratio = (brightness - 50) / 50
convFunc = lambda l: l + (1 - l) * ratio
for r in range(image.height()):
for c in range(image.width()):
h, s, l, a = QtGui.QColor(image.pixel(c, r)).getHslF()
image.setPixel(c, r, QtGui.QColor.fromHslF(
h, s, convFunc(l), a).rgba())
self.transformed.setPixmap(QtGui.QPixmap.fromImage(image))
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = ImageConverter()
window.show()
sys.exit(app.exec())
