【项目2】图片裁剪

  1 # 先介绍一个新函数, 原型如下
  2 # mode 是字符串, 我们使用 'RGBA' 表示生成一个每个像素由 rgba 四字节组成的图片
  3 # size 是一个 (w, h) 表示宽高的 tuple
  4 
  5 # Image.new(mode, size)
  6 
  7 
  8 # 例子如下
  9 
 10 from PIL import Image
 11 
 12 # 生成一个宽高都是 100 的 rgba 模式的图片
 13 # img = Image.new("RGBA", (100, 100))
 14 
 15 
 16 # 实现以下几个函数
 17 
 18 def crop(image, frame):
 19     """
 20     image 是一个 Image 对象
 21     frame 是一个 tuple 如下 (x, y, w, h)
 22         用于表示一个矩形的左上角座标 x y 和 宽高 w h
 23 
 24     不修改原图像
 25     返回一个 Image 对象, 它是用 frame 把 image 裁剪出来的新图像
 26     """
 27     # 把frame解包
 28     x, y, w, h = frame
 29     # 新建一个图像,宽高为 w, h
 30     img = Image.new("RGB", (w, h))
 31     # print('img size', img.size)
 32     # 对旧图像,取它对应区域的像素
 33     start_position = (x, y)
 34     # print('start', x, y)
 35     # 对新的图像,按照大小循环
 36     for i in range(0, w):
 37         for j in range(0, h):
 38             # 旧图像坐标
 39             position_image = (x + i, y + j)
 40             # 新图像坐标
 41             position_img = (i, j)
 42             r, g, b = image.getpixel(position_image)
 43             img.putpixel(position_img, (r, g, b))
 44     return img
 45 
 46 
 47 def flip(image):
 48     """
 49     image 是一个 Image 对象
 50 
 51     不修改原图像
 52     返回一个 Image 对象, 它是 image 上下镜像的图像
 53     """
 54     w, h = image.size
 55     img = Image.new("RGB", (w, h))
 56     for x in range(w):
 57         for y in range(h):
 58             position = (x, y)
 59             r, g, b = image.getpixel(position)
 60             img.putpixel((x, h - y - 1), (r, g, b))
 61     return img
 62 
 63 
 64 def flop(image):
 65     """
 66     image 是一个 Image 对象
 67 
 68     不修改原图像
 69     返回一个 Image 对象, 它是 image 左右镜像的图像
 70     """
 71     w, h = image.size
 72     img = Image.new("RGB", (w, h))
 73     for x in range(w):
 74         for y in range(h):
 75             position = (x, y)
 76             r, g, b = image.getpixel(position)
 77             img.putpixel((w - x - 1, y), (r, g, b))
 78     return img
 79 
 80 
 81 def add(img1, img2):
 82     """
 83     img1和img2是两张图片
 84     将它们上下拼接,img1在上,img2在下
 85     """
 86     w1, h1 = img1.size
 87     w2, h2 = img2.size
 88     h = h1 + h2
 89     w = 0
 90     if w1 < w2:
 91         w = w2
 92     else:
 93         w = w1
 94     image = Image.new("RGB", (w, h))
 95     for x in range(w1):
 96         for y in range(h1):
 97             position = (x, y)
 98             r, g, b = img1.getpixel(position)
 99             image.putpixel(position, (r, g, b))
100 
101     image.save("b1.jpg")
102 
103     for x in range(w2):
104         for y in range(h2):
105             get_position = (x, y)
106             put_position = (x, h1 + y)
107             r, g, b = img2.getpixel(get_position)
108             image.putpixel(put_position, (r, g, b))
109     return image
110 
111 
112 def main():
113     """
114     压缩包内有图片 a.jpg
115     图片是面朝左的 doge 加下方的四个字
116     要求生成一张图片 b.jpg, 狗头朝右但下方文字不变
117     """
118     image = Image.open("a.jpg")
119     # size(111, 120)
120     frame1 = (0, 0, 111, 95)
121     frame2 = (0, 95, 111, 25)
122     img1 = crop(image, frame1)
123     img2 = crop(image, frame2)
124     img1 = flop(img1)
125     super_image = add(img1, img2)
126     super_image.save('b.jpg')
127 
128 
129 main()

 

posted @ 2018-07-04 08:36  史达林之剑  阅读(136)  评论(0编辑  收藏  举报