使用Python将ppm颜色从黑色渐变为红色

1 投票
3 回答
1232 浏览
提问于 2025-04-17 16:58

Python

我该如何修改这段代码,让它生成一张从左到右渐变的图片,左边是黑色,右边是红色。

def main():
    f = open("testImage.ppm","w")
    f.write("P3 \n")
    width=256
    height=256
    f.write("%d %d \n"%(width,height))
    f.write("255 \n")
    for i in range(width*height):
        x=i%256
        y=i/256
        f.write("255, 0, 0 \n")
    f.close()

main()

3 个回答

0

你快到了,但你需要把你的红色计算放到一个循环里,这个循环会遍历每一个像素。你现在一直在写(255,0,0),但你其实想写的是(x,0,0)。

def main():
    f = open("testImage.ppm","w")
    f.write("P3 \n")
    width=256
    height=256
    f.write("%d %d \n"%(width,height))
    f.write("255 \n")
    for i in range(width*height):
        x=i%256
        y=i/256
        f.write("%s, 0, 0 \n" % x)  #SEE THIS LINE
    f.close()

main()
1

因为你想要从左到右的渐变效果是从黑色变成红色,所以图像的每一行都是一样的,只需要创建一次,然后重复使用就可以了。PPM图像文件中的每一行数据看起来会像下面这样,每组三个值对应一个RGB颜色值:

0 0 0 1 0 0 2 0 0 3 0 0 4 0 0 5 . . . 251 0 0 252 0 0 253 0 0 254 0 0 255 0 0

这里有一个修改过的代码版本,可以实现这个效果:

def main():
    with open("testImage.ppm", "wb") as f:
        f.write("P3\n")
        width = 256
        height = 256
        f.write("%d %d\n"%(width,height))
        f.write("255\n")
        delta_red = 256./width
        row = ' '.join('{} {} {}'.format(int(i*delta_red), 0, 0)
                                         for i in xrange(width)) + '\n'
        for _ in xrange(height):
            f.write(row)

main()

这是实际的结果(为了这个网站的需要,已经转换成了.png格式):

黑色到红色的渐变图像,由修改后的代码生成

1

在你的循环里,你总是写着 255, 0, 0。这其实是红、绿、蓝三种颜色的组合。上面循环中的 255 表示最大值是255。你的图片宽度是256个像素,所以在0到255的范围内有256个值。因此,我们可以很简单地推断出红色的部分应该是X值。你可以把你的代码改成这样:

f.write("%d, 0, 0 \n" % x)

撰写回答