https://pillow.readthedocs.io/en/stable/reference/Image.html
https://pillow.readthedocs.io/en/latest/reference/open_files.html
https://en.wikipedia.org/wiki/Grace_Hopper
https://en.wikipedia.org/wiki/Lenna
The 'Image' module provides a class with the same name which is used to represent a PIL image. The module also provides a number of factory functions, including functions to load images from files, and to create new images.
# PIL.Image.open(fp, mode='r', formats=None)
# fp : a filename (string), pathlib.Path object or a file object
#
# This is a lazy operation; this function identifies the file, but the file
# remains open and the actual image data is not read from the file until
# you try to process the data.
from PIL import Image
image1 = Image.open(file_name)
# processing ...
image1.close()
with Image.open(file_name) as image2: # recommended
print(image2.mode)
print(image2.format)
image3.save(file_name, format)
image3.save("foto.jpg", "JPEG")
image3.save("foto.jpg") # the filename extension is used to discover the file format
# The thumbnail size will preserve the aspect of the image and
# it will be no larger than the given size.
# Note that this function modifies the Image object in place.
# If you need to use the full resolution image as well,
# apply this method to a copy() of the original image.
with Image.open("hopper.jpg") as im:
im.thumbnail((128, 128)) # miniatura
im.save('hopper_thumbnail.jpg', "JPEG")
# PIL.Image.new(mode, size, color=0)
# mode : the mode to use for the new image
# size : a 2-tuple, containing (width, height) in pixels
# color : default is black
im = Image.new("RGB", (512, 512), color='black') # color=(0, 0, 0)
im = Image.new("RGB", (512, 512), color='red') # color=(255, 0, 0)
im = Image.new("RGB", (512, 512), color='green') # color=(0, 255, 0)
im = Image.new("RGB", (512, 512), color='blue') # color=(0, 0, 255)
im = Image.new("RGB", (512, 512), color='gray') # color=(128, 128, 128)
im = Image.new("RGB", (512, 512), color='white') # color=(255, 255, 255)
im = Image.new("L", (512, 512), color='black') # color=0
im = Image.new("L", (512, 512), color='gray') # color=128
im = Image.new("L", (512, 512), color='white') # color=255
# PIL.Image.fromarray(obj, mode=None)
import numpy as np
DIM = 128
a = np.zeros((DIM,DIM), dtype="uint8") # mode='L'
for i in range(DIM // 2):
for j in range(DIM // 4, (DIM // 4) * 3):
a[i,j] = 255 # white square
im = Image.fromarray(a, mode='L')
print ( im.getpixel((0,0)) ) # 0, (x,y)
print ( im.getpixel((DIM // 4, DIM // 2)) ) # 0
print ( im.getpixel((DIM // 2, DIM // 4)) ) # 255
DIM = 128
a = np.zeros((DIM,DIM,3), dtype="uint8") # mode='RGB'
for i in range(DIM):
for j in range(DIM):
for k in range(3):
a[i,j,k] = (i+10*j+50*k) % 256
im = Image.fromarray(a, mode='RGB')
im = Image.open("hopper.jpg")
print(im.mode) # RGB
print(im.size) # (517, 606)
print(im.format) # JPEG
print(im.getpixel((0,0))) # pixel (21, 26, 82)
a = np.asarray(im)
#a = np.array(im) # the same result
print(a.dtype) # uint8
print(a.shape) # (606, 517, 3)
# Rotating images.
with Image.open("hopper.jpg") as im:
im.rotate(45).show()
# im.rotate() returns a new rotated image
# new_im = im.rotate(45)
# new_im.save("rotated.jpg")
# Resizing images.
with Image.open("hopper.jpg") as im:
im.resize((130,150)).show()
# im.resize() returns a new resized image
# new_im = im.resize((130,150))
# new_im.save("resized.jpg")
# This crops the input image with the provided coordinates.
with Image.open("hopper.jpg") as im:
(left, upper, right, lower) = (20, 20, 100, 100)
im.crop((left, upper, right, lower)).show()
#
# Here the image "im" is cropped and assigned to new variable im_crop
# im_crop = im.crop((left, upper, right, lower))
# im_crop.save("cropped.jpg")
with Image.open("hopper.jpg") as im:
im.convert("L").show()
# im.convert() returns a converted copy of the image
# new_im = im.convert("L")
# new_im.save("bw.bmp")
# Image.paste(im, box=None, mask=None)
#
# Pastes another image into this image.
# Add margins of any width vertically and horizontally.
# +--------------+
# |l top r|
# |e +--------+ i|
# |f |original| g|
# |t +--------+ h|
# | bottom t|
# +--------------+
def add_margin(image, top, right, bottom, left, color):
width, height = image.size
new_width = width + right + left
new_height = height + top + bottom
result = Image.new(image.mode, (new_width, new_height), color)
result.paste(image, (left, top))
return result
# Add margins to the rectangle to make it square.
# +-----------+ +---+---+---+
# | | | | | |
# +-----------+ | |ori| |
# | original | | |gin| |
# +-----------+ | |al | |
# | | | | | |
# +-----------+ +---+---+---+
def expand2square(image, background_color):
width, height = image.size
if width == height:
return image
elif width > height:
result = Image.new(image.mode, (width, width), background_color)
result.paste(image, (0, (width - height) // 2))
return result
else:
result = Image.new(image.mode, (height, height), background_color)
result.paste(image, ((height - width) // 2, 0))
return result