How do I create an image in PIL using a list of RGB tuples?

前端 未结 3 663
一生所求
一生所求 2020-12-03 01:17

Suppose I have a list of pixels (represented as tuples with 3 RGB values) in a list that looks like list(im.getdata()), like this:

[(0,0,0),(255         


        
相关标签:
3条回答
  • 2020-12-03 01:26

    You can also use scipy for that:

    #!/usr/bin/env python
    
    import scipy.misc
    import numpy as np
    
    # Image size
    width = 640
    height = 480
    channels = 3
    
    # Create an empty image
    img = np.zeros((height, width, channels), dtype=np.uint8)
    
    # Draw something (http://stackoverflow.com/a/10032271/562769)
    xx, yy = np.mgrid[:height, :width]
    circle = (xx - 100) ** 2 + (yy - 100) ** 2
    
    # Set the RGB values
    for y in range(img.shape[0]):
        for x in range(img.shape[1]):
            r, g, b = circle[y][x], circle[y][x], circle[y][x]
            img[y][x][0] = r
            img[y][x][1] = g
            img[y][x][2] = b
    
    # Display the image
    scipy.misc.imshow(img)
    
    # Save the image
    scipy.misc.imsave("image.png", img)
    

    gives

    0 讨论(0)
  • 2020-12-03 01:33

    Here's a complete example since I didn't get the trick at first.

    from PIL import Image
    
    img = Image.new('RGB', [500,500], 255)
    data = img.load()
    
    for x in range(img.size[0]):
        for y in range(img.size[1]):
            data[x,y] = (
                x % 255,
                y % 255,
                (x**2-y**2) % 255,
            )
    
    img.save('image.png')
    

    And if you're looking for grayscale only, you can do Image.new('L', [500,500], 255) and then data[x,y] = <your value between 0 and 255>

    0 讨论(0)
  • 2020-12-03 01:38

    You can do it like this:

    list_of_pixels = list(im.getdata())
    # Do something to the pixels...
    im2 = Image.new(im.mode, im.size)
    im2.putdata(list_of_pixels)
    
    0 讨论(0)
提交回复
热议问题