here2share

# tk_buffer_gradient_zoom.py

Dec 11th, 2025
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.78 KB | None | 0 0
  1. # tk_buffer_gradient_zoom.py
  2.  
  3. import tkinter as tk
  4. from PIL import Image, ImageTk, ImageDraw
  5.  
  6. SQ = 600
  7. SQ2 = SQ * 2
  8.  
  9. root = tk.Tk()
  10. canvas = tk.Canvas(root, width=SQ, height=SQ)
  11. canvas.pack()
  12.  
  13. source_img = Image.new('RGB', (3, 3))
  14. pixels = source_img.load()
  15. grid_colors = {
  16.     (0, 0): (255, 255, 255),  # White
  17.     (0, 1): (255, 255, 0),    # Yellow
  18.     (0, 2): (0, 255, 0),      # Green
  19.     (1, 0): (255, 165, 0),    # Orange
  20.     (1, 1): (128, 128, 128),  # Gray (midpoint)
  21.     (1, 2): (0, 0, 255),      # Blue
  22.     (2, 0): (255, 0, 0),      # Red
  23.     (2, 1): (128, 0, 128),    # Purple
  24.     (2, 2): (0, 0, 0)         # Black
  25. }
  26. for x in range(3):
  27.     for y in range(3):
  28.         pixels[x, y] = grid_colors[(x, y)]
  29. source_img = source_img.resize((SQ2, SQ2))  # never use resample
  30.  
  31. mask = Image.new('L', (SQ2, SQ2), 255)
  32. draw = ImageDraw.Draw(mask)
  33. for x in range(0, SQ2, 2):
  34.     for y in range(0, SQ2, 2):
  35.         draw.point((x, y), fill=0)
  36.  
  37. step = 20
  38. def bystep(p):
  39.     if p % 2 == 0:
  40.         return p + step if p + step < 255 else p + 1
  41.     else:
  42.         return p - step if p - step > 0 else p - 1
  43.  
  44. def do_crop(img, zoom_size):
  45.     return img.crop((SQ - zoom_size // 2, SQ - zoom_size // 2,
  46.                      SQ + zoom_size // 2, SQ + zoom_size // 2))
  47.  
  48. while 1:
  49.     zoom_size = SQ2
  50.     cropped = do_crop(source_img, zoom_size)
  51.     resized = cropped.resize((SQ2, SQ2))
  52.     resized = resized.point(lambda p: bystep(p))
  53.     masked = Image.composite(resized, source_img, mask)
  54.  
  55.     zoom_factor = 0.95
  56.     while zoom_size > SQ:
  57.         zoom_size = int(zoom_size * zoom_factor)
  58.        
  59.         cropped = do_crop(masked, zoom_size).resize((SQ, SQ))
  60.         photo = ImageTk.PhotoImage(cropped)
  61.         canvas.create_image(0, 0, image=photo, anchor='nw')
  62.         root.update()
  63.  
  64.     source_img = cropped.resize((SQ2, SQ2))
Advertisement
Add Comment
Please, Sign In to add comment