0

How do I convert a list of 1D numbers to a bitmap image?

I tried the following but it seems it doesn't quite work.

from PIL import Image

def get_img():
  img = Image.new('RGB', (255,255), "black") # Create a new black image
  pixels = img.load() # Create the pixel map
  width, height = img.size
  for i in range(width):    # For every pixel:
    for j in range(height):
      pixels[i,j] = (i, j, 100) # Set the colour accordingly
  return pixels

display(get_img()) # <PixelAccess at 0x7fca63ded7d0>
0

2 Answers 2

1

PIL.Image has a function that takes a numpy array and converts it to an image: Image.from_array. You can use it to generate B&W, grayscale, RGB or RGBA images easily.

In you case, the cleanest way to build the image is:

import numpy as np
from PIL import Image

def get_img(width=255, height=255):
    data = np.arange(width * height, dtype=np.int64).reshape((height, width))
    img_data = np.empty((height, width, 3), dtype=np.uint8)
    img_data[:, :, 0] = data // height
    img_data[:, :, 1] = data % width
    img_data[:, :, 2] = 100
    return Image.fromarray(img_data)

display(get_img())

Result:

Result image

Note that although this way of building the data needs to go through the array 3 times, it is still faster than plain-python loops. For the default values of 255 by 255 images, it is almost 30 times faster.

Sign up to request clarification or add additional context in comments.

Comments

0
from PIL import Image
from IPython.display import display

img = Image.new('RGB', (255,255), "black") # Create a new black image
list_of_pixels = list(img.getdata())
print(list_of_pixels)
im2 = Image.new(img.mode, img.size)
im2.putdata(list_of_pixels)

display(im2)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.