多个图片怎么合成一个图片加文字,python多图合并成一张图
前段时间看到有人问怎么用Python实现多张图组词的效果。我觉得挺有意思的,就试了一下,正好赶上端午节,于是打算从网上下载1000张王心凌的照片,组成“端午安康”四个字。有兴趣的可以看看。
00-1010前言1。批量下载图片1。下载图片2。检查图片的数量。找相似图片2。马赛克图片1。马赛克图片与照片马赛克库2。计算颜色相似度实现拼接图片。
目录
前段时间看到有人问怎么用Python实现多张图组词的效果。我觉得挺有意思的,就试着做了一下,正好赶上端午节,于是打算从网上下载1000张王心凌的照片,组成“端午节健康”的字样,送给大家。
前言
首先我们需要从百度上下载大量的王心凌的图片,但是如果我们会在百度图片里右键下载的话就太麻烦了,所以我们打算直接用python写一个批量下载图片的代码,输入我们要下载的图片的关键字,然后输入我们要下载的图片的数量,就可以成功下载图片了!
该代码主要分为三个部分:
下载图片,查看图片数量,查找相似图片。
一、图片批量下载
def dowmloadppicture(html,关键字):
全局编号
# t=0
pic _ URL=re . find all( objURL : (。*?),,html,re。S) #首先使用正则表达式查找图片url
打印(找到关键字: keyword 的图像,将很快开始下载图像.)
对于pic_url:中的每个
打印(下载 str(num 1)图片,图片地址为: str(每张))
尝试:
如果每个都不是:
pic=requests.get(每个,超时=7)
else:
继续
除了BaseException:
打印(“错误,当前图片无法下载”)
继续
else:
string=file r \ \ keyword _ str(num)。 jpg
fp=open(字符串, wb )
fp.write(图片内容)
fp.close()
数量=1
如果num=numPicture:
返回
1.下载图片
定义查找(url,A):
全局列表
打印(请稍候,正在检测图片总数.)
t=0
i=1
s=0
而t 1000:
Url=url字符串(t)
尝试:
#这里正在进行一些工作
Result=A.get(Url,timeout=7,allow_redirects=False)
除了BaseException:
t=t 60
继续
else:
结果=结果.文本
pic _ URL=re . find all( objURL : (。*?),,结果,re。S) #先用正则表达式找到图片url。
s=len(pic_url)
if len(pic_url
) == 0:
break
else:
List.append(pic_url)
t = t + 60
return s
3.查找相似图片
def dowmloadPicture(html, keyword):global num
# t =0
pic_url = re.findall("objURL":"(.*?)",, html, re.S) # 先利用正则表达式找到图片url
print(找到关键词: + keyword + 的图片,即将开始下载图片...)
for each in pic_url:
print(正在下载第 + str(num + 1) + 张图片,图片地址: + str(each))
try:
if each is not None:
pic = requests.get(each, timeout=7)
else:
continue
except BaseException:
print(错误,当前图片无法下载)
continue
else:
string = file + r\\ + keyword + _ + str(num) + .jpg
fp = open(string, wb)
fp.write(pic.content)
fp.close()
num += 1
if num >= numPicture:
return
使用效果:
二、图片马赛克
当我们下载好了所需要的王心凌的照片,下一步我们需要用这些图片组成我们需要的文字。
所以首先准备一张要拼成的图片,比如需要组成的文字,如端午安康,我们可以用 PowerPoint)制作一个喜欢的文字样式,然后保存成jpg格式。
1.使用photomosaic库实现图片马赛克
代码如下所示:
import photomosaic as pm# 加载要拼成的图片image(jpg 格式,图片越大,得到的拼图的每个小图分辨率越高)
image = pm.imread("1.jpg", as_gray=False)
# 从指定文件夹加载图片库(需要比较多的图片才能获得较好的效果)
pool = pm.make_pool("wxl/*.jpg")
# 制作 50*50 的拼图马赛克
mosaic = pm.basic_mosaic(image, pool, (200, 200))
# 保存拼图
pm.imsave("mosaic.jpg", mosaic)
不过由于这个库版本问题,所以需要在库函数里面做一点点修改才能成才运行。
def crop_to_fit(image, shape):"""
Return a copy of image resized and cropped to precisely fill a shape.
To resize a colored 2D image, pass in a shape with two entries. When
``len(shape) < image.ndim``, higher dimensions are ignored.
Parameters
----------
image : array
shape : tuple
e.g., ``(height, width)`` but any length <= ``image.ndim`` is allowed
Returns
-------
cropped_image : array
"""
# Resize smallest dimension (width or height) to fit.
d = np.argmin(np.array(image.shape)[:2] / np.array(shape))
enlarged_shape = (tuple(np.ceil(np.array(image.shape[:len(shape)]) *
shape[d]/image.shape[d])) +
image.shape[len(shape):])
resized = resize(image, enlarged_shape,
mode=constant, anti_aliasing=False)
# Now the image is as large or larger than the shape along all dimensions.
# Crop any overhang in the other dimension.
crop_width = []
for actual, target in zip(resized.shape, shape):
overflow = actual - target
# Center the image and crop, biasing left if overflow is odd.
left_margin = int(np.floor(overflow / 2))
right_margin = int(np.ceil(overflow / 2))
crop_width.append((left_margin, right_margin))
# Do not crop any additional dimensions beyond those given in shape.
for _ in range(resized.ndim - len(shape)):
crop_width.append((0, 0))
cropped = crop(resized, crop_width)
return cropped
在裁剪图片的时候输入需要是int型,所以把left_margin和right_margin强制转化成int型。
实现效果:
效果确实一般般,局部放大,可以观察出,生成图是由照片拼接而成的,所以整体大图的清晰度也与小照片的数量有关,也有可能是图片分辨率大小以及组成图片尺寸不一的原因,所以又尝试了另一种方法。
2.计算颜色相似度实现图片马赛克
def readSourceImages(sourcepath,blocksize):print(开始读取图像)
# 合法图像列表
sourceimages = []
# 平均颜色列表
avgcolors = []
for path in tqdm(glob.glob("{}/*.jpg".format(sourcepath))):
image = cv2.imread(path, cv2.IMREAD_COLOR)
if image.shape[-1] != 3:
continue
image = cv2.resize(image, (blocksize, blocksize))
avgcolor = np.sum(np.sum(image, axis=0), axis=0) / (blocksize * blocksize)
sourceimages.append(image)
avgcolors.append(avgcolor)
print(结束读取)
return sourceimages,np.array(avgcolors)
通过这个方法能够获取照片集中的每张照片与组成的大图之间颜色的相似度,将相似的照片放到对应的位置。
实现效果:
感觉效果比原来要好一些,但是还是不够清晰。
到此这篇关于Python实现多张图片合成文字的效果的文章就介绍到这了,更多相关Python多张图片合成文字内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。