与python和pil的一张相册
Python(59), PIL(1)对于一个快速的周末冒险,我决定使用Python成像库采取任意收集照片并生成照片库。借助PIL文件这结果很有趣。(GitHub上可用的完整代码。)
我编辑的图片都是我自己的,来了从我的帖子关于kamioka,几年前我住的小镇。
首先,让我们只加载并在不修改它的情况下重载图像。
>>>进口图像导入映像>>>IMG.=图像。打开(“kamioka.png”)img = image.open(“kamioka.png”)>>>IMG.。保存(“kam2.png”)img.save(“kam2.png”)
保存的图像与原始图像相同,善良读者可能尚未见过。
我承认,不要太令人兴奋。接下来,让我们尝试创建一个新的图像,其中包含两个第一图像的两个副本。
def镜子(IMG.那N=2):X那y=IMG.。尺寸mirror_img.=图像。新的(“RGB”那(X*N那y),“白色的”)为了一世在范围(0.那N):mirror_img.。粘贴(IMG.那(一世*X那0.)))返回mirror_img.
然后,我们可以使用它来创建具有两个副本的图像。
>>>IMG.=图像。打开(“kamioka.png”)img = image.open(“kamioka.png”)>>>镜子(IMG.)。保存(“kam3.png”)镜子(IMG).save(“kam3.png”)
我们也可以使用它来制作包含更多副本的图像。
>>>IMG.=图像。打开(“kamioka.png”)img = image.open(“kamioka.png”)>>>镜子(IMG.那N=5.)。保存(“kam3_2.png”)镜子(IMG).save(“kam3_2.png”)
这里有五份。
现在,让我们尝试为图片创建边界以添加一些复杂性。让我们从单色边界开始。
def边界(IMG.那宽度=10.那颜色=“白色的”):X那y=IMG.。尺寸边=图像。新的(“RGB”那(X+(2*宽度),y+(2*宽度)),颜色)边。粘贴(IMG.那(宽度那宽度)))返回边
这是一个白色边界图像的镜像。
>>>IMG.=图像。打开(“kamioka.png”)img = image.open(“kamioka.png”)>>>镜子(边界(IMG.)))。保存(“kam4.png”)镜子(边框(IMG))。保存(“kam4.png”)
我必须承认这是一个非常不抑郁的边界。这边界
可以扩展功能,使其可以多次自定义边框。而不是假设边框具有宽度和颜色,让我们将边框描述为宽度/颜色元组列表。
def边界(IMG.那BRDRS.=[(2那“白色的”),(8.那“黑色的”),(1那“灰色的”)]):X那y=IMG.。尺寸宽度=和([Z.[0.]为了Z.在边界])边=图像。新的(“RGB”那(X+(2*宽度),y+(2*宽度)),“灰色的”)抵消=0.打印抵消为了B_Width.那B_COLOR.在BRDRS.:边。粘贴(图像。新的(“RGB”那(X+2*(宽度-抵消),y+2*(宽度-抵消)),B_COLOR.),(抵消那抵消)))抵消=抵消+B_Width.边。粘贴(IMG.那(抵消那抵消)))返回边
再次打电话边界
那
>>>镜子(边界(IMG.)))。保存(“kam5.png”)镜子(边框(IMG))。保存(“kam5.png”)
这带来了我们:
既然我们已经改进了边界有点,让我们制作一个函数,它采取图像列表并整齐地将它们一起显示在一起。为了保持简单的事情,这里有一些妥协:
- 我们将缩放所有图像以具有相同的高度,
- 我们将把图片打破到大块的块中,最大的块是最小的原始图像的大小,
- 我们将统一地铺设图片。
首先,我们需要规范所有图像的所有高度,使得它们是最短图像的所有高度。
def正常化(IMGS.):“将所有图像的高度正常化到最短的图像。”最短的=闵([X。尺寸[1]为了X在IMGS.])调整大小=[]为了IMG.在IMGS.:高度_RATIO.=漂浮(IMG.。尺寸[1])/最短的纽约=IMG.。尺寸[0.]*高度_RATIO.IMG2.=IMG.。调整大小((纽约那最短的),图像。antialias.)调整大小。附加(IMG2.)返回调整大小
接下来,我们将更广泛的图像打破到块中,其中每个块都像肤色的图像一样宽。
def块(IMGS.):“将图像分成粗糙度等于最小图像的大小。”最小的=闵([X。尺寸[0.]为了X在IMGS.])高度=IMGS.[0.]。尺寸[1]chunked_imgs.=[]为了IMG.在IMGS.:部分=数学。CEIL.((IMG.。尺寸[0.]*1.0)/最小的)为了一世在Xrange.(0.那部分):盒子=(一世*最小的那0.那(一世+1)*最小的那高度)IMG2.=IMG.。庄稼(盒子)IMG2.。加载()chunked_imgs.。附加(IMG2.)返回chunked_imgs.
第三,我们需要将图像铺设到专辑页面中。(注意合并
假设图像已归一化和块状。)
def合并(IMGS.那per_row.=4.):将“格式化为行和列的平等大小。”宽度=IMGS.[0.]。尺寸[0.]高度=IMGS.[0.]。尺寸[1]Page_Width.=宽度*per_row.PAGE_HEIGHT.=高度*数学。CEIL.((1.0*Len.(IMGS.)))/4.)页=图像。新的(“RGB”那(Page_Width.那PAGE_HEIGHT.),“白色的”)柱子=0.排=0.为了IMG.在IMGS.:如果柱子!=0.和柱子%per_row.==.0.:排=排+1柱子=0.p=(宽度*柱子那高度*排)页。粘贴(IMG.那p)柱子=柱子+1返回页
最后,我们将这些函数呼叫勾结到专辑
使用它们一起使用它们的功能并添加边框。
def专辑(IMGS.):IMGS.=正常化(IMGS.)IMGS.=块(IMGS.)IMGS.=[边界(X)为了X在IMGS.]返回合并(IMGS.)
现在,创建第一张专辑。
>>>专辑(IMGS.)。保存(“ALBUM.PNG”)专辑(IMG).Save(“Album.png”)
在这里,我使用了kamioka文章中的所有图像,这些图像发生在已经相同的大小。
这里是应用于原始图像的输出加上第一个呼叫的输出专辑
。
所以,看起来完全可怕,但具有更好的图像选择它可能实际上看起来很体面。我肯定喜欢和pil一起工作,我希望有些人来自这个蜿蜒的项目的片段作为有用的例子。