AD

python_PIL_crop方法详解

0x01概述

crop(截取/切割图片)介绍

im.crop(box) => image  box[a,b,c,d]
返回当前图像的一个矩形区域。在官方文档中,box参数是一个定义了左、上、右、下坐标的4元元组。但在查找资料的时候,有的说cd定义的是右下角像素点坐标,有的说是宽度和高度。到底是什么情况,我自己进行了如下实验。
      

0x02实验过程


我创建了一个图片,大小为300×170像素,在图片的坐标(0,0)处有一个黑色像素,然后在图片的横竖中值——150列和第85行(像素在图片中的物理坐标),画了1像素宽的黑色直线。另外在第113列画了1像素宽的竖线。并且在黑色线左侧/上侧画了1像素的红色直线,黑色线右侧/下侧画了1像素的绿色直线。


细节如下:

实验一

我使用img.crop([0,0,150,85]) 对原始图片进行截取操作,获得如下结果:
可以看到图片最左边和最下边是红色线体,并没有截取到第150列和第85行的像素。即图片没有截取(150,85)该像素点所在的行和列。当截取到了坐标(0,0)所在的像素。

实验二

使用img.crop([0,0,151,86])进行截取,结果如下:
可以看到,这次截取到了第150列和第85行的像素。

实验三

使用img.crop([1,1,150,85])进行截取,结果如下:
结果和实验一类似,截取到了(1,1)处的像素,当没有截取(150,85)该像素点所在的行和列。

实验四

使用img.crop([113,0,150,85])进行截取,结果如下:
可以看到图片截取到了(113,0)坐标所在的行及列像素,当同样没有截取到(150,85)像素所在行列的像素。

实验五

我在原始图片的最后一行及一列画1像素的直线,并且在右下角像素(299,169)坐标处点了1像素黑色,细节如下:
现在打印图片的宽和高参数,并使用img.crop([0,0,300,170])进行截取,结果如下:
图片的宽和高如下:


实验六

       使用img.crop([0,0,301,171])进行截取,结果如下:
发现在原始图片的最右边和最下边,多了一个黑边。

0x03结论

       crop(box)中,box参数的值为一个含有四个元素的列表[a,b,c,d]。该列表的值表示要截取到区域范围。
       其中(a,b)为要截取并包含的左上角像素的坐标。(c,d)为要截取到,但并不包含在内的右下角像素点的坐标。可以理解为截取但并不包含该图片的第c列,第d行。
这是因为图片的坐标是左上角是(0,0),该坐标位于图片的第1列第1行,第2列第2行所在的像素坐标为(1,1)
c列,第d行的像素坐标应该是(c-1,d-1)
以上面的图片为例,该图片宽和高为300×170,但实际上最右下角像素所在坐标为(299,169)。该图片坐标为(150,85)的像素点,实际位于图片的第151列,第86

所以如果要截取的图需要包含(150,85)的像素点,需要截取到图片的第151列,第86行,即img.crop([0,0,151,86])

评论

此博客中的热门博文

简单粗暴导出小米便签

我——终于一个人了

Ubiquiti_Networks_UniFi_Cloud_Key_authed_rce