如何更改每个像素

时间:2015-04-24 22:15:56

标签: python image-processing pyqt qimage

我是Python的新手,我仍然不知道究竟是什么样的像素返回(看起来像是一个rgb或rgba的模型 - 缺少类型声明并没有帮助) 我想抓住每个像素并改变它。

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):

1 个答案:

答案 0 :(得分:0)

我不确定我理解你想要什么,但是因为你是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')

结果:

result