在 PyQt 中,如何将 QImage 转换为像素列表? [英] In PyQt, how do I convert QImage to a list of pixels?

查看:74
本文介绍了在 PyQt 中,如何将 QImage 转换为像素列表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I see the QImage.bits() function, and the QImage.constBits(), but both return a voidptr and I'm not sure in python what you can do with that. I am familiar with the C++ syntax, but not for python.

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

As for data type, i mean this: A black and white pixel would be equal to [[0,0,0],[255,255,255]] where the QImage is Format.RGB888

推荐答案

查看YouTube 视频

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

I hope that I understand your needs, here I put together an app. that will convert QImage to List of Quadruplets RGBA Value, I hope that it help you at least to figure out how to do it, you may implement it different for your needs, you may use matrix/matrix manipulation lib. like NumPy or any other matrix manipulation lib.

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

But, in this case I did not create any dependency, because I think is better to stay simple and if you need something more complex you can dig in...

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

You gonna need an image, to keep it simple I will provide 3 images, each of them with different size and pixel colors Image 1Image 2Image 3

您还可以检查我的网站查看代码

代码如下:

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_())

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

I hope that help you out, and if you need more details about this subject you can visit my website from time to time...

这篇关于在 PyQt 中,如何将 QImage 转换为像素列表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆