Python的PIL对象crop函数的实现示例

作者:

文章目录
  • PIL库(Python Imaging Library)的Image.crop()方法是图像处理的核心工具,通过定义四元组坐标实现矩形区域裁剪。函数签名如下: cropped_image = img.crop(box) 其中box=(left, upper, right, lower)为裁剪区域的边界坐标: 坐标系统:左上角为原点(0,0),向右为X轴正方向,向下为Y轴正方向 参数规则:坐标值必须为整数,且right需大于left,lower需大于upper,否则触发SystemError: tile cannot extend outside image
  • 坐标定位原理以384×384图像中心裁剪256×256区域为例: center_x, center_y = img.size[0]//2, img.size[1]//2 box = (center_x-128, center_y-128, center_x+128, center_y+128) 边界处理逻辑当裁剪区域超出图像边界时,PIL会自动截断至有效范围。例如对1920×1200图像进行左上角裁剪: # 合法裁剪范围:left∈[0,1920], upper∈[0,1200] cropped = img.crop((0, 0, 3000, 800)) # 实际裁剪区域调整为(0,0,1920,800)
  • 场景1:九宫格裁剪 from PIL import Image img = Image.open(‘flower.jpg’) w, h = img.size grid_w, grid_h = w//3, h//3 for i in range(3): for j in range(3): box = (i*grid_w, j*grid_h, (i+1)*grid_w, (j+1)*grid_h) region = img.crop(box) region.save(f’grid_{i}_{j}.png’) 场景2:动态坐标计算通过元素定位实现精准裁剪(如网页截图元素提取): from selenium import webdriver from PIL import Image driver = webdriver.Chrome() driver.get(‘https://www.baidu.com’) driver.save_screenshot(‘baidu.png’) element = driver.find_element_by_id(‘su’) location = element.location size = element.size img = Image.open(‘baidu.png’) cropped = img.crop(( location[‘x’], location[‘y’], location[‘x’] + size[‘width’], location[‘y’] + size[‘height’] )) cropped.save(‘button.png’)
  • 坐标偏移问题显示比例非100%时需强制缩放: driver.execute_script(‘document.body.style.zoom=”0.8″‘) 格式兼容问题TIFF格式建议改用OpenCV处理: import cv2 img = cv2.imread(‘image.tif’) cropped = img[100:300, 200:400] # (y1:y2, x1:x2) cv2.imwrite(‘cropped.tif’, cropped) 高性能裁剪批量处理时建议使用ImageChops优化: from PIL import ImageChops mask = Image.new(‘L’, img.size, 0) draw = ImageDraw.Draw(mask) draw.rectangle(box, fill=255) cropped = ImageChops.multiply(img, mask)
  • 非矩形裁剪:通过Image.paste()配合透明蒙版实现 坐标系转换:使用img.size动态计算相对坐标 Exif方向处理:自动校正图像旋转方向 if img.getexif().get(0x0112) in [3,6,8]: img = img.transpose(Image.ROTATE_90) 通过系统掌握crop()函数的参数特性与边界处理逻辑,结合具体场景的坐标计算方法,可高效完成从基础裁剪到复杂图像处理的各类任务。实践建议从简单矩形裁剪入手,逐步掌握动态坐标计算、格式兼容处理等进阶技巧,最终实现专业级的图像处理能力。 到此这篇关于Python的PIL对象crop函数的实现示例的文章就介绍到这了,更多相关Python的PIL对象crop函数内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python图像处理库crop()函数 thumbnail方法使用详解 Micropython固件使用Pico刷固件并配置VsCode开发环境的方法 详解PyCharm安装MicroPython插件的教程
  • 目录
    • 一、函数基础解析
    • 二、核心参数详解
    • 三、典型应用场景
    • 四、常见问题解决方案
    • 五、进阶技巧

    PIL库(Python Imaging Library)的Image.crop()方法是图像处理的核心工具,通过定义四元组坐标实现矩形区域裁剪。函数签名如下:

    cropped_image = img.crop(box)
    

    其中box=(left, upper, right, lower)为裁剪区域的边界坐标:

    • 坐标系统:左上角为原点(0,0),向右为X轴正方向,向下为Y轴正方向
    • 参数规则:坐标值必须为整数,且right需大于leftlower需大于upper,否则触发SystemError: tile cannot extend outside image

    1. 坐标定位原理
      以384×384图像中心裁剪256×256区域为例:
      center_x, center_y = img.size[0]//2, img.size[1]//2
      box = (center_x-128, center_y-128, center_x+128, center_y+128)
      
    2. 边界处理逻辑
      当裁剪区域超出图像边界时,PIL会自动截断至有效范围。例如对1920×1200图像进行左上角裁剪:
      # 合法裁剪范围:left∈[0,1920], upper∈[0,1200]
      cropped = img.crop((0, 0, 3000, 800))  # 实际裁剪区域调整为(0,0,1920,800)
      

    场景1:九宫格裁剪

    from PIL import Image
    img = Image.open('flower.jpg')
    w, h = img.size
    grid_w, grid_h = w//3, h//3
    
    for i in range(3):
        for j in range(3):
            box = (i*grid_w, j*grid_h, (i+1)*grid_w, (j+1)*grid_h)
            region = img.crop(box)
            region.save(f'grid_{i}_{j}.png')
    

    场景2:动态坐标计算
    通过元素定位实现精准裁剪(如网页截图元素提取):

    from selenium import webdriver
    from PIL import Image
    
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    driver.save_screenshot('baidu.png')
    element = driver.find_element_by_id('su')
    location = element.location
    size = element.size
    
    img = Image.open('baidu.png')
    cropped = img.crop((
        location['x'], 
        location['y'],
        location['x'] + size['width'],
        location['y'] + size['height']
    ))
    cropped.save('button.png')
    

    1. 坐标偏移问题
      显示比例非100%时需强制缩放:
      driver.execute_script('document.body.style.zoom="0.8"')
      
    2. 格式兼容问题
      TIFF格式建议改用OpenCV处理:
      import cv2
      img = cv2.imread('image.tif')
      cropped = img[100:300, 200:400]  # (y1:y2, x1:x2)
      cv2.imwrite('cropped.tif', cropped)
      
    3. 高性能裁剪
      批量处理时建议使用ImageChops优化:
      from PIL import ImageChops
      mask = Image.new('L', img.size, 0)
      draw = ImageDraw.Draw(mask)
      draw.rectangle(box, fill=255)
      cropped = ImageChops.multiply(img, mask)
      

    • 非矩形裁剪:通过Image.paste()配合透明蒙版实现
    • 坐标系转换:使用img.size动态计算相对坐标
    • Exif方向处理:自动校正图像旋转方向
      if img.getexif().get(0x0112) in [3,6,8]:
          img = img.transpose(Image.ROTATE_90)
      

    通过系统掌握crop()函数的参数特性与边界处理逻辑,结合具体场景的坐标计算方法,可高效完成从基础裁剪到复杂图像处理的各类任务。实践建议从简单矩形裁剪入手,逐步掌握动态坐标计算、格式兼容处理等进阶技巧,最终实现专业级的图像处理能力。

    到此这篇关于Python的PIL对象crop函数的实现示例的文章就介绍到这了,更多相关Python的PIL对象crop函数内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Python图像处理库crop()函数 thumbnail方法使用详解
    • Micropython固件使用Pico刷固件并配置VsCode开发环境的方法
    • 详解PyCharm安装MicroPython插件的教程

    站内搜索