Pillow (PIL) Quick Reference
============================

INSTALLATION
  pip install pillow

BASIC USAGE
  from PIL import Image

  img = Image.open("image.png")
  img.save("output.png")
  img.show()

IMAGE INFO
  img.size                 (width, height)
  img.mode                 "RGB", "RGBA", "L", "1"
  img.format               "PNG", "JPEG", etc.
  img.info                 Metadata dict

PIXEL ACCESS
  px = img.load()          Get pixel access
  px[x, y]                 Get pixel value
  px[x, y] = (R, G, B)    Set pixel value

  # Get all pixels
  pixels = list(img.getdata())

CONVERSIONS
  img.convert("L")         Grayscale
  img.convert("RGB")       RGB
  img.convert("RGBA")      RGBA
  img.convert("1")         Black and white

OPERATIONS
  img.resize((w, h))       Resize
  img.crop((l, t, r, b))   Crop (left, top, right, bottom)
  img.rotate(90)           Rotate
  img.transpose(Image.FLIP_LEFT_RIGHT)   Flip horizontal

CREATE NEW IMAGE
  img = Image.new("RGB", (width, height), (255, 255, 255))

COMMON CTF PATTERNS
  # LSB steganography extraction
  img = Image.open("steg.png")
  px = img.load()
  bits = ""
  for y in range(img.height):
      for x in range(img.width):
          r, g, b = px[x, y][:3]
          bits += str(r & 1)  # Extract LSB
  # Convert bits to bytes
  message = bytes(int(bits[i:i+8], 2) for i in range(0, len(bits), 8))

  # Hide data in pixels
  for i, byte in enumerate(data):
      x, y = i % img.width, i // img.width
      r, g, b = px[x, y][:3]
      px[x, y] = ((r & 0xFE) | (byte >> 7 & 1), g, b)

  # Visual comparison
  from PIL import ImageChops
  diff = ImageChops.difference(img1, img2)
  diff.save("diff.png")

  # Extract text from image regions
  region = img.crop((10, 10, 200, 50))
