图片分区域变换颜色效果的实现

59 阅读2分钟

一位开发者试图创建一个图像,该图像分为四个象限,每个象限的颜色都有不同的变化。他成功地完成了一半的图像,但另一半却变得模糊,而且没有错误信息。他希望在右上角实现灰度效果,在右下角实现黑白效果。以下是他的代码:

import cImage as image

img = image.Image("/home/users/groth1/Downloads/selfie.JPG")
newimg = image.EmptyImage(img.getWidth(), img.getHeight())
win = image.ImageWin(title="Pic",width=img.getWidth(),height=img.getHeight())
img.draw(win)

xQuadrantBoundary = img.getWidth()//2
yQuadrantBoundary = img.getHeight()//2

for row in range(img.getHeight()):  
    for col in range(img.getWidth()):
        p = img.getPixel(col, row)

        if row < yQuadrantBoundary:
            if col < xQuadrantBoundary:
                # upper left negative
                newred = 255 - p.getRed()
                newgreen = 255 - p.getGreen()
                newblue = 255 - p.getBlue()
                newpixel1 = image.Pixel(newred, newgreen, newblue)

                img.setPixel(col, row, newpixel1)
            elif col >= xQuadrantBoundary:
               # upper right grayscale ***
                red = p.getRed()
                green = p.getGreen()
                blue = p.getBlue()
                avg = (red + green + blue) / 3.0
                newpixel2 = image.Pixel(newred, newgreen, newblue)
                img.setPixel(col, row, newpixel2)

        elif row >= yQuadrantBoundary:
            if col < xQuadrantBoundary:
                #  lower left no green
                newred = p.getRed()
                newgreen = 0
                newblue = p.getBlue()
                newpixel3 = image.Pixel(newred, newgreen, newblue)
                img.setPixel(col, row, newpixel3)
            elif col >= xQuadrantBoundary:
                #  lower right black and white ***
                red = p.getRed()
                if red > 140:
                    val = 255
                else:
                    val = 0
            newpixel4 = image.Pixel(newred, newgreen, newblue)
            img.setPixel(col, row, newpixel4)

img.draw(win)
win.exitonclick()

2、解决方案

根据给定的答案,问题是由于以下代码中的错误引起的:

newpixel2 = image.Pixel(newred, newgreen, newblue)

newpixel4 = image.Pixel(newred, newgreen, newblue)

它们应该分别替换为:

newpixel2 = image.Pixel(avg, avg, avg)

newpixel4 = image.Pixel(val, val, val)

因为在原代码中,newred, newgreennewblue 变量被重复使用,导致颜色条纹出现。

以下是修改后的代码:

import cImage as image

img = image.Image("/home/users/groth1/Downloads/selfie.JPG")
newimg = image.EmptyImage(img.getWidth(), img.getHeight())
win = image.ImageWin(title="Pic",width=img.getWidth(),height=img.getHeight())
img.draw(win)

xQuadrantBoundary = img.getWidth()//2
yQuadrantBoundary = img.getHeight()//2

for row in range(img.getHeight()):  
    for col in range(img.getWidth()):
        p = img.getPixel(col, row)

        if row < yQuadrantBoundary:
            if col < xQuadrantBoundary:
                # upper left negative
                newred = 255 - p.getRed()
                newgreen = 255 - p.getGreen()
                newblue = 255 - p.getBlue()
                newpixel1 = image.Pixel(newred, newgreen, newblue)

                img.setPixel(col, row, newpixel1)
            elif col >= xQuadrantBoundary:
               # upper right grayscale ***
                red = p.getRed()
                green = p.getGreen()
                blue = p.getBlue()
                avg = (red + green + blue) / 3.0
                newpixel2 = image.Pixel(avg, avg, avg)
                img.setPixel(col, row, newpixel2)

        elif row >= yQuadrantBoundary:
            if col < xQuadrantBoundary:
                #  lower left no green
                newred = p.getRed()
                newgreen = 0
                newblue = p.getBlue()
                newpixel3 = image.Pixel(newred, newgreen, newblue)
                img.setPixel(col, row, newpixel3)
            elif col >= xQuadrantBoundary:
                #  lower right black and white ***
                red = p.getRed()
                if red > 140:
                    val = 255
                else:
                    val = 0
                newpixel4 = image.Pixel(val, val, val)
                img.setPixel(col, row, newpixel4)

img.draw(win)
win.exitonclick()

现在,图像将按照预期效果进行处理,在右上角实现灰度效果,在右下角实现黑白效果。