python - 在 PyQt 中,如何将 QImage 转换为像素列表?

标签 python pyqt pyqt4

我看到了 QImage.bits() 函数和 QImage.constBits(),但两者都返回 voidptr 并且我'我不确定在 python 中你能用它做什么。我熟悉 C++ 语法,但不熟悉 python。

至于数据类型,我的意思是: 黑白像素等于 [[0,0,0],[255,255,255]],其中 QImageFormat.RGB888

最佳答案

See the youtube video

我希望我了解您的需求,这里我整理了一个应用程序。这会将 QImage 转换为四元组 RGBA 值列表,我希望它至少能帮助您弄清楚如何做到这一点,您可以根据您的需要实现不同的方法,您可以使用矩阵/矩阵操作库。喜欢NumPy或任何其他矩阵操作库。

但是,在这种情况下,我没有创建任何依赖项,因为我认为保持简单更好,如果您需要更复杂的东西,您可以深入研究...

您需要一张图像,为了简单起见,我将提供 3 张图像,每张图像都有不同的大小和像素颜色图像 1:
Image 1图2:
Image 2图3:
Image 3

您还可以check my website to see the code

这是代码:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys


class main_window(QDialog):
    def __init__(self):
        QDialog.__init__(self)

        # Create a QTextBrowser
        qtb_rgba = QTextBrowser(self)
        # Create an empty list
        li_pixels = list()


        #!! QImage to list of pixels !! >>> RGB format
        image = QImage()
        load_image = image.load("test_img_3x3", ".jpg")
        # Make sure you got an image named "test_img_3x3" .jpg extension , it needs to sit on your HDD,
        # in the root from where you run the script
        # create it with the size of 3x3 , do it in Paint, or any other 2d image manipulation software

        # An assert error will occur if fails to open your image
        assert load_image == True

        # Find more data about our image
        # In our case is obvios that we create with our hand an image .jpg with a size of 3x3
        # Even so, the functions bellow will may help us sometimes

        # Obtain image size
        image_width = image.width()
        image_height = image.height()
        print("Your image size is:\nWidth: " + str(image_width) + " Height: " + str(image_height) + "\n" + str(image_width) + "x" + str(image_height))


        # Get QRGB values
        qrgb = image.pixel(0, 0)
        print("QRGB Values: " + str(qrgb))
        # Convert it to QColor
        qrgb_to_QCol = QColor(qrgb)
        # Once you got it converted in QColor you got a lot of freedom to choose from,
        # you can convert it to some of the most popular formats like:
        # CMYK, HSL, RGB, RGBA, magenta, or even individual chanels R , G , B  + a lot of other formats, even Floats...

        # Convert it to RGBA
        rgba = qrgb_to_QCol.getRgb()
        print("RGBA Values: " + str(rgba))

        # In order to achieve our goal: list of pixels for the entire image
        # we got many ways to achieve it, depending of your needs you may implelent it different
        # I will continue by producing a list of quadruplets values, 
        # from left to right - top to bottom 

        # The Quadruplets value for the list will be, which mean that 0 will hold value 0 on list , 1 hold 1 and so on...
        # y _ _
       #x|0 1 2
        #|3 4 5
        #|6 7 8

        # And the position will be:
        # y     _     _
       #x|0.0   1.0   2.0
        #|0.1   1.1   2.1
        #|0.2   1.2   2.2

        # So let`s do it

        # Generate a list of numbers for width
        li_num_width = []
        for i in range(image_width):
            li_num_width.append(i)

        # Generate a list of numbers for height
        li_num_height = []
        for i in range(image_height):
            li_num_height.append(i)

        # List for x num
        x = [li_num_width for i in range(len(li_num_height))]
        print("\nX list is:\n" + str(x))

        # List for y num
        for i in range(len(li_num_height)):
            y = [[i]*len(li_num_width) for i in range(len(li_num_height))]
        print("\nY list is:\n" + str(y))

        
        row_el_li = []
        row_el_li_y = []

        # Obtain list numbers for x
        for i in range(len(li_num_height)):
            row = x[i]
            for i in range(len(li_num_width)):
                row_el = row[i]
                #print(row_el)
                row_el_li.append(row_el)

        print("\nRow Elements list x: \n" + str(row_el_li))
        
        # Obtain list numbers for y
        for i in range(len(li_num_height)):
            row_y = y[i]
            for i in range(len(li_num_width)):
                row_el_y = row_y[i]
                #print(row_el_y)
                row_el_li_y.append(row_el_y)

        print("\nRow Elements list y: \n" + str(row_el_li_y))
        
        # Create a list, which eventualy will hold qrgb values, which is our goal
        qrgb_li = []
        # How many values will the list hold? or How many pixels in the image do we have?
        num_pixels = len(li_num_width) * len(li_num_height)
        print("\nNumber of Pixels:" + str(num_pixels))
        
        for i in range(num_pixels):
            ordered_qrgb = image.pixel(row_el_li[i], row_el_li_y[i])
            qrgb_li.append(ordered_qrgb)

        
        # One more step lets convert from QRGB list to RGBA list, which will lead us to the end of this tutorial
        rgba_li = []

        for i in range(len(qrgb_li)):
            qrgb_li_to_QCol = QColor(qrgb_li[i])
            rgba_set = qrgb_li_to_QCol.getRgb()
            rgba_li.append(rgba_set)

        print("\nList of Quadruplets RGBA Value: \n" + str(rgba_li))
        
        
        #!! QImage to list of pixels End !!

        qtb_rgba.setText(str(rgba_li))
        #.......
        self.setFixedSize(250, 300)
        self.setWindowTitle("QImage to list of pixels")

#.......3D Sasu Catalin
app = QApplication(sys.argv)
dialog = main_window()
dialog.show()
sys.exit(app.exec_())

我希望对您有所帮助,如果您需要有关此主题的更多详细信息,您可以访问 my website时不时...

关于python - 在 PyQt 中,如何将 QImage 转换为像素列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32059309/

相关文章:

python - Qt QlineEdit 错误弹出窗口/气球消息

python - pyqt qlabel仅显示字符串的第一个字符

python - 如何执行我的脚本并在 PYQT5 的 GUI 中打印它?

python - QMediaPlayer 在 PyQt4 中不可用?

python - 在 Mac OS X 下安装 Mathics

python - 如何以编程方式在 Qt 中制作水平线

python - PyQt中带有QThread的后台线程

python - Django 不显示两个 DetailView

python - 未知错误的 Matplotlib 散点图

python - 根据第三个值在图中使用自己的颜色图(无散点图)