图片切碎片脚本 python PIL库实践

  python PIL库实践运用,对图像进行切碎片操作。

  原图如图一

图一

  我们想要的是图片的不同部分,比如图二中1、2、3、4每一个分区单独的碎片,

图二

  做法是做出4张跟原图大小一样的碎片模版图,白底,想要的区域涂黑(非纯白)即可。1区域的碎片模板图如图三所示:

图三

  脚本处理图片的方法:先找出碎片模版中的非白区域(可以不规则),然后将原图中这个区域内的所有像素点的颜色都放到新的一张跟原图像素大小一样的新图上,新图的其余位置都设置成透明(可以根据自己的不同需求进行不同的调整)。 1碎片模版得到的新图碎片如图四所示:

图四

  附上处理脚本

  

  1 # -*- coding=utf-8 -*-
  2 from PIL import Image
  3 import os
  4 import shutil
  5
  6 SUFIX_PNG = "png"
  7 SUFIX_JPEG = "jpeg"
  8 SUFIX_LIST = [SUFIX_PNG, SUFIX_JPEG]
  9 NEED_RESIZE_TAG = True
 10 SMALL_SIZE = (126,126)
 11
 12
 13 def isWhite(color):
 14     r, g, b = color[0], color[1], color[2]
 15     if r == 255 and g == 255 and  b==255:
 16         return True
 17     return False
 18
 19 def getImgFileList(folderPath):
 20     modelFileNames = []
 21     for dirpath, dirnames, filenames in os.walk(folderPath):
 22         for filename in filenames:
 23             sufix = os.path.splitext(filename)[1][1:]
 24             if sufix in SUFIX_LIST:
 25                 modelFileNames.append(filename)
 26     modelFileNames.sort()
 27     return modelFileNames
 28
 29 def getFileName(fileFullName):
 30     return fileFullName[:fileFullName.rindex(".")]
 31
 32 def checkImgSize(sizeDict, widthSum, heightSum, imgCnt):
 33     # imgCnt = len(sizeDict.keys())
 34     averWidth, averHeight = widthSum/imgCnt, heightSum/imgCnt
 35     for sizeKey, sizeValue in sizeDict.items():
 36         if sizeValue[‘width‘] != averWidth:
 37             print "[ERROE],{IMG} width is wrong! please check it again!".format(IMG=sizeKey)
 38             return False
 39         if sizeValue[‘height‘] != averHeight:
 40             print "[ERROE, ]{IMG} height is wrong!please check it again!".format(IMG=sizeKey)
 41             return False
 42     return True
 43
 44
 45 def test():
 46     folderPath = ‘./model/‘
 47     srcPath = ‘./src/‘
 48     srcBackupPath = ‘./srcBackup/‘
 49     targetPath = ‘./done/‘
 50     currPath = ‘.‘
 51     # check model &src folder
 52     if not os.path.exists(folderPath) or not os.path.exists(srcPath):
 53         print ‘[ERROR], dir [model] or [src] does not exist‘
 54         return
 55
 56     # creat the target folder
 57     if not os.path.exists(targetPath):
 58         os.mkdir(targetPath)
 59
 60     partImgNames = getImgFileList(folderPath)
 61     srcImgNames = getImgFileList(srcPath)
 62
 63     partDict = {}
 64     srcDict = {}
 65     sizeDict = {}
 66     imgCnt = 0
 67     widthSum, heightSum = 0, 0
 68
 69     # change src  img file sufix 把之前的png原图改成jpeg格式
 70     # 需不需要改格式
 71     # for _, srcImgName in enumerate(srcImgNames):
 72     #     if srcImgName.endswith(SUFIX_PNG):
 73     #         im = Image.open(srcPath+srcImgName)
 74     #         bg = Image.new("RGB", im.size, (255,255,255))
 75     #         newSrcImgName = srcImgName.replace(SUFIX_PNG, SUFIX_JPEG)
 76     #         bg.paste(im, im)
 77     #         bg.save(srcPath+newSrcImgName)
 78     #         if os.path.exists(srcPath+srcImgName):
 79     #             if not os.path.exists(srcBackupPath):
 80     #                 os.mkdir(srcBackupPath)
 81     #             shutil.move(srcPath+srcImgName, srcBackupPath)
 82
 83     srcImgNames = getImgFileList(srcPath)
 84     for index, partImgName in enumerate(partImgNames):
 85         partDict[index] = Image.open(folderPath+partImgName)
 86         width, height = partDict[index].size
 87         sizeDict[partImgName] = {}
 88         sizeDict[partImgName][‘width‘] = width
 89         sizeDict[partImgName][‘height‘] = height
 90         widthSum += width
 91         heightSum += height
 92         imgCnt += 1
 93
 94     for index, srcImgName in enumerate(srcImgNames):
 95         srcDict[index] = Image.open(srcPath+srcImgName)
 96         width, height = srcDict[index].size
 97         sizeDict[srcImgName] = {}
 98         sizeDict[srcImgName][‘width‘] = width
 99         sizeDict[srcImgName][‘height‘] = height
100         widthSum += width
101         heightSum += height
102         imgCnt += 1
103
104     # img size check, 检查图片尺寸
105     if not checkImgSize(sizeDict, widthSum, heightSum, imgCnt):
106         return
107
108     for srcIndex, srcImgName in enumerate(srcImgNames):
109         tempSrcImg = srcDict[srcIndex].copy()
110         colorDataSrc1 = tempSrcImg.getdata()
111
112         for modelIndex, partImgName in enumerate(partImgNames):
113             tempImg = partDict[modelIndex].copy() # copy img , 复制图片
114             colorData2 = tempImg.getdata()
115             colorStore = []  # to save colors
116             for index, color2 in enumerate (colorData2):
117                 if not isWhite(color2):
118                     colorStore.append(colorDataSrc1[index])
119                 else:
120                     colorStore.append((0,0,0,0))
121
122             tempImg.putdata(colorStore)
123             # make target files names
124             newFileName = "{TARGET}{NAME}-{INDEX}.{SUFIX}".format(
125                 TARGET=targetPath,
126                 NAME=getFileName(srcImgName),
127                 INDEX=modelIndex+1,
128                 SUFIX=SUFIX_PNG)
129             tempImg.save(newFileName, SUFIX_PNG)
130
131             if NEED_RESIZE_TAG:
132                 smallTargetPath = ‘./smalldone/‘
133                 if not os.path.exists(smallTargetPath):
134                     os.mkdir(smallTargetPath)
135                 smallImg = tempImg.resize(SMALL_SIZE)
136                 newFileName = "{TARGET}{NAME}-{INDEX}.{SUFIX}".format(
137                 TARGET=smallTargetPath,
138                 NAME=getFileName(srcImgName),
139                 INDEX=modelIndex+1,
140                 SUFIX=SUFIX_PNG)
141                 smallImg.save(newFileName, SUFIX_PNG)
142             print ‘------create {NAME} done-----‘.format(NAME=newFileName)
143     print ‘>>>>>>>>>>>>>>>>>Job Done<<<<<<<<<<<<<<<<‘
144
145
146 if __name__ == "__main__":
147     test()

  目录组织结构如图五所示:

图五

  最终done文件夹的结果如图六所示:

图六

  Note:

  1. 原图放在src文件夹下,原图可以有很多张,脚本对图片的宽高尺寸有检查,如果批量处理的话,尺寸必须保持一致,不然的话需要注掉尺寸检查的代码。
  2. 碎片模版图放在model文件夹下,所有碎片模版的尺寸必须跟原图尺寸一致。
  3. 生成的碎片会存放到done文件夹里。
  4. 支持resize功能,将resize后的新碎片存到smalldone文件夹下。
时间: 2024-12-20 21:17:08

图片切碎片脚本 python PIL库实践的相关文章

python PIL库回顾

之前用PIL的时候都不知道看官方文档,网上搜索结果靠前的一些介绍性的博客其实很扯淡,讲两个函数.贴三张图,文章就完了. 今天把他的文档看了看,发现一点也不简单,网上介绍的不过是冰山一角. 对于我这样一个不太懂多媒体的人,如果用到图像处理,主要也就这些操作: 读写.取通道.两幅图合并.像素点操作.各种滤镜.色彩模式转换.图像旋转.缩放.裁剪.仿射. PIL对付这些小喽啰,都是完全没有问题的. 读写 open是Image类的一个方法,返回值是一个Image对象,值得注意的是,open不能打开网络图片

python PIL库回顾1

1 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HE

使用Python PIL库中的Image.thumbnail函数裁剪图片

今天,是我来到博客园的第五天,发现自己还没有头像,想着上传ubuntu系统中我很喜欢的一个背景图片来当头像,但是因为图片过大,上传失败了.那么,我们如何使用python中强大的PIL库来进行图片裁剪呢? from PIL import Image img = Image.open('avatar.jpg') img.thumbnail((480,480)) img.save('thumb.jpg') 首先,找到自己的图片位置,接着如下: 一.从PIL库中导入Image 二.调用Image.ope

Python PIL库安装

由于需要使用Python操作图片,想使用sudo pip install PIL引入PIL(Python Imaging Library)库,但是结果如下: could not find a version that satisfies the requirement PIL.(form versions:) No matching distribution found for PIL. 这个提示很费解,只能去找度娘了,原来已经用Pillow代替了PIL,在使用方面没有不同,API都是相同的.真

Centos 安装python PIL模块(实践)

今天测试的时候,发现报没有PIL的错误,敲入 pip install PIL  并没有成功,看到许多博客说敲入这个命令成功的也有可能在运行中遇到别的问题,所以还是自己安装比较靠谱. 1.下载wget http://effbot.org/downloads/Imaging-1.1.7.tar.gz 2.解压:tar xvfz Imaging-1.1.7.tar.gz 下载并解压成功之后,到解压目录,找到 Imaging-1.1.7/setup.py 这个文件,修改下面几行代码(默认TCL_ROOT

python 利用PIL库进行更改图片大小的操作

python 是可以利用PIL库进行更改图片大小的操作的,当然一般情况下是不需要的,但是在一些特殊的利用场合,是需要改变图片的灰度或是大小等的操作的,其实用python更改图片的大小还是蛮简单的,只需要几行代码,有一点可能刚入门的小伙伴们可能不知道PIL库,PIL是一个库的简写,他的真名叫做pillow,因此,需要pip install pillow 用anaconda的话是conda install pillow千万不要pip/conda install PIL咯,下面贴出代码,希望对一些小伙

纯代码系列:Python实现验证码图片(PIL库经典用法用法,爬虫12306思路)

现在的网页中,为了防止机器人提交表单,图片验证码是很常见的应对手段之一.这里就不详细介绍了,相信大家都遇到过. 现在就给出用Python的PIL库实现验证码图片的代码.代码中有详细注释. #!/usr/bin/env python #coding=utf-8 import random from PIL import Image, ImageDraw, ImageFont, ImageFilter _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小

python,使用PIL库对图片进行操作

在做识别验证码时,需要对验证码图片进行一些处理,所以就学习了一下PIL的知识,下面是我总结的一些常用方法. 注明:图片的操作都需要Image库,所以要使用import Image导入库 1.打开图片 import Imageimg=Image.open("code.jpg") 注:有些图片名称是包含中文的,就需要在""前加上u,例:img=Image.open(u"阿布.jpg") 以下各个操作均是基于原图进行的修改,原图为: 2.展示图片 im

Python 之 使用 PIL 库做图像处理

Python 之 使用 PIL 库做图像处理 1. 简介. 图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴.PIL (Python Imaging Library)是 Python 中最常用的图像处理库,目前版本为 1.1.7,我们可以 在这里 下载学习和查找资料. Image 类是 PIL 库中一个非常重要的类,通过这个类来创建实例可以有直接载入图像文件,读取处理过的图像和通过抓取的方法得到的图像这三种方法. 2. 使用. 导入 Image