Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # tk_buffer_gradient_zoom.py
- import tkinter as tk
- from PIL import Image, ImageTk, ImageDraw
- SQ = 600
- SQ2 = SQ * 2
- root = tk.Tk()
- canvas = tk.Canvas(root, width=SQ, height=SQ)
- canvas.pack()
- source_img = Image.new('RGB', (3, 3))
- pixels = source_img.load()
- grid_colors = {
- (0, 0): (255, 255, 255), # White
- (0, 1): (255, 255, 0), # Yellow
- (0, 2): (0, 255, 0), # Green
- (1, 0): (255, 165, 0), # Orange
- (1, 1): (128, 128, 128), # Gray (midpoint)
- (1, 2): (0, 0, 255), # Blue
- (2, 0): (255, 0, 0), # Red
- (2, 1): (128, 0, 128), # Purple
- (2, 2): (0, 0, 0) # Black
- }
- for x in range(3):
- for y in range(3):
- pixels[x, y] = grid_colors[(x, y)]
- source_img = source_img.resize((SQ2, SQ2)) # never use resample
- mask = Image.new('L', (SQ2, SQ2), 255)
- draw = ImageDraw.Draw(mask)
- for x in range(0, SQ2, 2):
- for y in range(0, SQ2, 2):
- draw.point((x, y), fill=0)
- step = 20
- def bystep(p):
- if p % 2 == 0:
- return p + step if p + step < 255 else p + 1
- else:
- return p - step if p - step > 0 else p - 1
- def do_crop(img, zoom_size):
- return img.crop((SQ - zoom_size // 2, SQ - zoom_size // 2,
- SQ + zoom_size // 2, SQ + zoom_size // 2))
- while 1:
- zoom_size = SQ2
- cropped = do_crop(source_img, zoom_size)
- resized = cropped.resize((SQ2, SQ2))
- resized = resized.point(lambda p: bystep(p))
- masked = Image.composite(resized, source_img, mask)
- zoom_factor = 0.95
- while zoom_size > SQ:
- zoom_size = int(zoom_size * zoom_factor)
- cropped = do_crop(masked, zoom_size).resize((SQ, SQ))
- photo = ImageTk.PhotoImage(cropped)
- canvas.create_image(0, 0, image=photo, anchor='nw')
- root.update()
- source_img = cropped.resize((SQ2, SQ2))
Advertisement
Add Comment
Please, Sign In to add comment