【项目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()