缘由
这两年网上出现了使用python中的PIL或是pillow库拼接图片和朋友圈图像的例子,让我非常感兴趣,比较典型的是这几个例子:
《朋友圈的朋友们,你们终于可以互相看到了》
《1000张图片如何拼接》
我实操了一下,发现还是有些小问题,下面是我消化吸收和改进的过程。改进的地方:
1.存放图片的文件夹是任意指定的,里面文件名没有要求,不需要按照序号1,2,……这样的命名,更实用;
2.图片的合并效果更好,是根据图片集的图片的个数来确定背景画板的大小,而不是让图片来适应画板,这就避免合并图边缘的空白或黑边问题,同时对图片集大小没有限制,任意个数的图片都能拼接。
3.背景画布的大小可以灵活调整,你只需要确定每行放几张图片,每张图片的大小是多少,就可以得到超长图或是扁平图之类的。
需要用到的知识点
PIL(Python Imaging Library)已经是Python平台事实上的图像处理标准库。PIL功能强大,简单易用。由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此在python中,安装pillow库就可以使用PIL库了。
Image 类是PIL库中一个非常重要的类,通过这个类来创建实例可以有直接载入图像文件,读取处理过的图像。
以下是Image类几个最常用的方法。
new('RGBA', (x,y))
创建一张图片,默认是黑色的。可以修改参数。
image = Image.new('RGB', (width, height), (255, 255, 255))
open(filename), save(outfilename)
open(filename) 打开一个图片文件把图片读进来。save(outfilename)保存图片。
resize(size,size)
调整图片大小(缩放图片)。近千张图片,先要缩小一下。
安装依赖库
sudo pip install pillow
代码
下面是我将平时喜爱的歌手专辑的封面整理后,拼接得到的大图,每个album的大小一般为300*300.
#!/usr/bin/env python
#encoding: utf-8
#description: 将指定文件夹下面的图片拼接为一张大图(没有黑边)
#date: 2018-12-18import PIL.Image as Image
import os
import math#==========基本配置信息==========#待合成图片所在目录
dir_in = '/home/taoyx/图片/Mac专用Album/'
#输出大图目录
dir_out = '/home/taoyx/program_develop/python_dev/img_joint/'
#单张图片大小预设
img_w = 300
img_h = 300
#每行图片个数,为了输出美观,要结合图片集大小灵活调整,图片总数最好能整除col
col = 37#================================#先统计图片目录中的图片个数
img_list = os.listdir(dir_in)
total_cnt = len(img_list)
print('Path:%s, images total:[%d]' %(dir_in, total_cnt))#确定画板的宽和高,math.ceil返回浮点数还需取整才行
row = int(math.ceil(total_cnt / col))
bg_w = img_w * col
bg_h = row * img_h
print('image:(%d,%d), background:(%d,%d), col:%d, row:%d' %(img_w, img_h, bg_w, bg_h, col, row))#创建指定大小的画板
bg = Image.new('RGBA',(bg_w, bg_h))cnt = 0
w = 0
h = 0
#逐个将图片粘贴进来
for fn in os.listdir(dir_in):#修复部分文件名前面带有'._'前缀的bug,导致找不到指定文件 if fn[0] == '.' and fn[1] == '_':fn = fn[2:]print('file name:%s' %fn)fname = os.path.join(dir_in, os.path.basename(fn))#print('full file name:%s' %fname)try:img = Image.open(fname)except IOError:print 'IOError:%s' %fnameelse:#将每张图片缩放到指定大小img = img.resize((img_w, img_h), Image.ANTIALIAS)#注意精确确定每张图片在合成背景上所在的像素区域w = cnt % colif cnt != 0 and w == 0:h += 1cnt += 1print('count:%d, position:(%d,%d)' %(cnt, w, h))bg.paste(img, (w * img_w, h * img_h))#保存最后的合并图到指定输出目录
bg.save(dir_out + 'album_all.png')
在命令行执行
python img_joint.py
效果图
下面是对某电影海报文件夹内海报图片的拼接效果
vue中安装wangEditor
cnpm install wangeditor
创建公用组件:在src/vue/components文件夹中创建wangEditor.vue
在前面的博文中,我将300多张电影海报拼接为了一张103MB的巨幅图片,我想拿它做电脑桌面(1080P),但是这么多的图片,存储和加载是个麻烦事儿,需要将它压缩到几MB大小。
在Ubuntu 16.04.5 LTS上利用python 2.7版本的pillow库拼接近千张图片实录
我尝试了市面上所有的压缩软件,发现处理时间冗长且压缩...
本文介绍的例子在Android安卓手机上测试通过。 先看看效果吧。可以看到这个开发好的安卓应用有三个按钮:Zoom In缩小图片,Zoom Out放大图片和Save保存。 初始页面: 可以在左边边框自由移动图片,图片下面的调试界面debug screen会显示详细的图片矩阵matrix信息: 点击Save button后,根据左...
原理分析:当鼠标在小图片上移动时,通过捕捉鼠标在小图片上的位置,定位大图片的相应位置。(同时,当鼠标在小图片上移动时,右侧大图片往相反的方向移动。) 放大镜特效设计: ①页面元素:小图片,大图片以及盛放图片的容器 ②事件捕获:onmouseover(当鼠标指针移动到指定对象上时发生)、onmouseout(当鼠标指针移除指定对象时发...
我觉得你的时间安排得很慢。也许你的安装出了问题?在我试过这个测试程序:#!/usr/bin/python3import sysimport numpy as npimport cv2from PIL import Imagefrom profilehooks import profile@profiledef try_numpy(im...
6.方法测试
在这个部分我们要整体的测试我们的程序,对前面的知识和内容有一个整体的应用和概括。
这是Udacity提供的相应资料,在code文件夹中有一个Rover_Project_Test_Notebook.ipynb文件,提供了输出视频的笔记本文件。
由于个人喜好的原因,我选择了pycharm2019来运行此程序。
(1)...
/*默认加载图片*/
.class-name { /*背景图片*/background: url(../../img/banner/banner-default.jpg) no-repeat center bottom;width: 100%;height: 861px;
}
.class-name:after { /*默认加载背景图...
函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界。 cv2.boundingRect(array) -> retval 参数: array - 灰度图像(gray-scale image)或 2D点集( 2D point s...
首先贴上代码原作者的github:https://github.com/chenyuntc/simple-faster-rcnn-pytorch(非代码作者,博文只解释代码) 今天看完了simple-faster-rcnn-pytorch-master代码的最后一个train.py文件,是时候认真的总结一下了,我打算一共总结四篇博客用...
像素宽度:W(Width)
填充大小:P(Padding)
卷积核大小:K(Kernel-size)
步长大小:S(stride)
卷积后所得feature map尺寸大小计算公式如下:
补充:
1.Padding的作用用于解决图像边缘信息损失的问题;
2.计算卷积后map尺寸时若不为整数则向下取整,而计...