如何更改每个像素

How do I change each pixel

我是 Python 的新手,我仍然不知道 Qimage 的像素到底是什么 returns(它似乎是 rgb 或 rgba 的 tupel - 缺少类型声明无济于事) 我想抓住每一个像素并改变它。

newqim = QImage(imWidth, imHeight, QImage.Format_ARGB32)
for xstep in range(0, imWidth - 1):
    for ystep in range(0, imHeight - 1):

        pixelValueTuple = im.getpixel((xstep, ystep))
        pixelR = pixelValueTuple[0]
        pixelG = pixelValueTuple[1]
        pixelB = pixelValueTuple[2]
        copiedValue = qRgb(pixelR, pixelG, pixelB)

        newqim.setPixel(xstep, ystep, copiedValue)

上面是提供的代码,我想我然后迭代那个 newqim,但我无法理解我将如何在 Python 中做到这一点。

for xstep in range(0, imWidth-1):
    for ystep in range(0, imHeight -1):

我不确定我是否理解您想要什么,但由于您是 Python 的新手,这里有一些提示...

开箱

此代码:

pixelR = pixelR[0]
pixelG = pixelValueTuple[1]
pixelB = pixelValueTuple[2]

等同于:

pixelR, pixelG, pixelB = pixelValueTuple[:3]

如果你确定len(pixelValueTuple) == 3,那么就是:

pixelR, pixelG, pixelB = pixelValueTuple

PEP-8

有点吹毛求疵,但是 python 伙计们往往对语法有点不满意。请阅读 PEP-8。从现在开始,我将根据它命名变量(camelCase 例如变量只会伤害我的眼睛 %-)。

范围

您可能需要 range(width) 而不是 range(0, width-1)

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> range(0, 10 - 1)
[0, 1, 2, 3, 4, 5, 6, 7, 8]

现在回到你的问题。

width, height = 300, 300
im = QImage(width, height, QImage.Format_ARGB32)

for x in range(im.width()):
    for y in range(im.height()):
        r, g, b, a = QColor(im.pixel(x ,y)).getRgb()
        # ... do something to r, g, b, a ...
        im.setPixel(x, y, QColor(r, g, b, a).rgb())

例子

width, height = 100, 100
im = QImage(width, height, QImage.Format_ARGB32)

for x in range(im.width()):
    for y in range(im.height()):
        im.setPixel(x, y, QColor(255, x * 2.56, y * 2.56, 255).rgb())

im.save('sample.png')

结果: