how can I use the python imaging library to create a bitmap
Categories:
Creating Bitmaps with Python Imaging Library (PIL)

Learn how to generate and manipulate bitmap images programmatically using the Python Imaging Library (Pillow), covering basic image creation, pixel manipulation, and saving various formats.
The Python Imaging Library (PIL), now maintained as Pillow, is a powerful tool for image processing in Python. It provides extensive capabilities for opening, manipulating, and saving many different image file formats, including bitmaps. This article will guide you through the process of creating a bitmap image from scratch, manipulating its pixels, and saving it to a file.
Understanding Bitmaps and PIL Basics
A bitmap, or raster graphic, is a digital image composed of a rectangular grid of pixels. Each pixel contains color information, and the overall image is formed by arranging these pixels. PIL simplifies working with these images by providing an Image
object that represents the image data. You can create a new image, load an existing one, or manipulate individual pixels or regions.
flowchart TD A[Start] --> B{Import Pillow}; B --> C[Create New Image Object]; C --> D[Access Pixel Data (e.g., ImageDraw)]; D --> E[Manipulate Pixels/Draw Shapes]; E --> F[Save Image to File]; F --> G[End];
Basic workflow for creating and saving a bitmap with Pillow.
Creating a Simple Bitmap Image
To create a new bitmap, you'll use the Image.new()
method. This method requires the mode, size, and an optional color for the background. Common modes include 'RGB' for full-color images, 'L' for grayscale, and '1' for black and white (binary) images. The size is specified as a tuple (width, height)
.
from PIL import Image
# Define image parameters
width = 200
height = 150
mode = 'RGB' # Red, Green, Blue
background_color = (255, 255, 255) # White background
# Create a new blank image
img = Image.new(mode, (width, height), background_color)
# Save the image
img.save('blank_bitmap.bmp')
print(f"Created blank_bitmap.bmp ({width}x{height} in {mode} mode)")
Creating a blank white RGB bitmap using Pillow.
Manipulating Pixels and Drawing Shapes
Once you have an Image
object, you can manipulate individual pixels or use the ImageDraw
module to draw shapes and text. Direct pixel manipulation is done using putpixel()
, while ImageDraw
offers higher-level drawing primitives.
from PIL import Image, ImageDraw
width = 200
height = 150
img = Image.new('RGB', (width, height), (255, 255, 255))
# Direct pixel manipulation: Draw a red square
for x in range(50, 100):
for y in range(50, 100):
img.putpixel((x, y), (255, 0, 0)) # Red color
# Using ImageDraw: Draw a blue circle and green line
draw = ImageDraw.Draw(img)
draw.ellipse((120, 20, 180, 80), fill=(0, 0, 255), outline=(0, 0, 0))
draw.line((20, 130, 180, 100), fill=(0, 255, 0), width=3)
img.save('manipulated_bitmap.bmp')
print("Created manipulated_bitmap.bmp with a square, circle, and line.")
Manipulating pixels directly and drawing shapes using ImageDraw.
putpixel()
can be slow for large images or complex patterns. For performance-critical applications, consider using NumPy arrays for pixel data and then converting the array to a Pillow Image
object.Saving the Bitmap in Different Formats
The Image.save()
method automatically infers the file format from the filename extension. While we've been saving to .bmp
, you can easily save to other formats like PNG, JPEG, GIF, etc., by simply changing the extension. Pillow handles the conversion internally.
from PIL import Image
# Assuming 'img' is an existing Image object
# For demonstration, let's create a simple one
img = Image.new('RGB', (100, 100), (0, 128, 255)) # Blue color
# Save as BMP
img.save('output.bmp')
print("Saved as output.bmp")
# Save as PNG (supports transparency, lossless)
img.save('output.png')
print("Saved as output.png")
# Save as JPEG (lossy compression, good for photos)
# Note: JPEG does not support transparency, and quality can be specified
img.save('output.jpg', quality=95)
print("Saved as output.jpg with 95% quality")
Saving the same image in BMP, PNG, and JPEG formats.