天呐!Python秒出朋友圈秀图!

news2024/11/29 20:30:03

大家注意:因为微信最近又改了推送机制,经常有小伙伴说错过了之前被删的文章,比如前阵子冒着风险写的爬虫,再比如一些限时福利,错过了就是错过了。

所以建议大家加个星标,就能第一时间收到推送。👇

d2a6fd7b80115f0b996461e49614f28f.jpeg


相信很多朋友,手机已经存了超多自拍照片吧!

那么,如何花式晒图才可以爆赞朋友圈呢?

今天,跟大家一起分享一个超火的晒图方式:3D滚动照片墙视频,回忆氛围感满满,大家点点赞哦!

6aae5fcc987c10cdb68075c8e362d186.gif

我们用python解决其中一个环节“制作拼图”,它是视频里的照片墙。

来对比一下,用python和手机APP『醒图』分别制作一张72图拼图,效率差距有多大。

下图是用python拼接的孙艺珍照片,它是上面gif图中的背景墙:

d5653fbbbede493f42482b05962efb66.jpeg

开始啦,提前准备好72张照片。

python制作拼图

python很简单,修改下脚本参数,2秒拼接完成

image_size = 384  # 每张小图片的大小
    image_colnum = 12  # 合并成一张图后,一行有几个小图

代码如下

import os
import PIL.Image as Image
def resize_by_width(infile, image_size):
    """按照宽度进行所需比例缩放"""
    im = Image.open(infile)
    (x, y) = im.size
    lv = round(x / image_size, 2) + 0.01
    x_s = int(x // lv)
    y_s = int(y // lv)
    print("x_s", x_s, y_s)
    out = im.resize((x_s, y_s), Image.ANTIALIAS)
    return out
def get_new_img_xy(infile, image_size):
    """返回一个图片的宽、高像素"""
    im = Image.open(infile)
    (x, y) = im.size
    lv = round(x / image_size, 2) + 0.01
    x_s = x // lv
    y_s = y // lv
    # print("x_s", x_s, y_s)
    # out = im.resize((x_s, y_s), Image.ANTIALIAS)
    return x_s, y_s
# 定义图像拼接函数
def image_compose(image_colnum, image_size, image_rownum, image_names, image_save_path, x_new, y_new):
    to_image = Image.new('RGB', (image_colnum * x_new, image_rownum * y_new))  # 创建一个新图
    # 循环遍历,把每张图片按顺序粘贴到对应位置上
    total_num = 0
    for y in range(1, image_rownum + 1):
        for x in range(1, image_colnum + 1):
            from_image = resize_by_width(image_names[image_colnum * (y - 1) + x - 1], image_size)
            # from_image = Image.open(image_names[image_colnum * (y - 1) + x - 1]).resize((image_size,image_size ), Image.ANTIALIAS)
            to_image.paste(from_image, ((x - 1) * x_new, (y - 1) * y_new))
            total_num += 1
            if total_num == len(image_names):
                break
    return to_image.save(image_save_path)  # 保存新图
def get_image_list_fullpath(dir_path):
    file_name_list = os.listdir(dir_path)
    image_fullpath_list = []
    for file_name_one in file_name_list:
        file_one_path = os.path.join(dir_path, file_name_one)
        if os.path.isfile(file_one_path):
            image_fullpath_list.append(file_one_path)
        else:
            img_path_list = get_image_list_fullpath(file_one_path)
            image_fullpath_list.extend(img_path_list)
    return image_fullpath_list
def merge_images(image_dir_path,image_size,image_colnum):
    # 获取图片集地址下的所有图片名称
    image_fullpath_list = get_image_list_fullpath(image_dir_path)
    print("image_fullpath_list", len(image_fullpath_list), image_fullpath_list)
    image_save_path = r'{}.jpg'.format(image_dir_path)  # 图片转换后的地址
    # image_rownum = 4  # 图片间隔,也就是合并成一张图后,一共有几行
    image_rownum_yu = len(image_fullpath_list) % image_colnum
    if image_rownum_yu == 0:
        image_rownum = len(image_fullpath_list) // image_colnum
    else:
        image_rownum = len(image_fullpath_list) // image_colnum + 1
    x_list = []
    y_list = []
    for img_file in image_fullpath_list:
        img_x, img_y = get_new_img_xy(img_file, image_size)
        x_list.append(img_x)
        y_list.append(img_y)
    print("x_list", sorted(x_list))
    print("y_list", sorted(y_list))
    x_new = int(x_list[len(x_list) // 5 * 4])
    y_new = int(x_list[len(y_list) // 5 * 4])
    image_compose(image_colnum, image_size, image_rownum, image_fullpath_list, image_save_path, x_new, y_new)  # 调用函数
    # for img_file in image_fullpath_list:
    #     resize_by_width(img_file,image_size)
if __name__ == '__main__':
    image_dir_path = r'C:\drf2\drf2\图片\baby - 副本'  # 图片集地址
    image_size = 384  # 每张小图片的大小
    image_colnum = 12  # 合并成一张图后,一行有几个小图
    merge_images(image_dir_path, image_size, image_colnum)

“醒图”制作拼图

打开『醒图』APP,点击「拼图」导入9张照片。进入拼图界面,选择4:3比例中的九宫格模板,调整好照片大小和位置,再导出照片。其余照片也是按照这个模板拼图。

d18cfa8eaa3904548a13f27189a76634.png

fe5544c322b1b91cdf21752231f9ce98.png

下一步,将刚刚拼好的4张九宫格图,用4:3比例中的四宫格拼接在一起。

展示72张照片,可以重复上面的操作,再将每张含36张照片的图片,用横向的「长图拼接」拼在一起

ffb0f14dce3298c4212725f6c0aa5457.png

eadbb772126966a88b79df7ef8f197de.png

效率对比

醒图app导入的图片数量有限制,需要9张再9张这样拼接,拼接完要导出,把导出的图片拼接成36张图,再去「长图拼接」。

这种情况下,同样的效果,python一秒钟拿结果简直太爽。

后面再想制作3D照片墙就简单了,因为最花时间的就是在APP上拼接数十张图片。

3D滚动照片墙

接下来,制作3D立体效果需要另外一个APP:AVU

d9c4a3ccb6ff701461e0a71529765f5c.png

大家有兴趣可以去研究一下,下面是制作好的3D立体效果

3e27a5b236f2951fcb4b2b02b6ebee7a.gif

到这里,3D照片墙背景就完成啦。

如果你想把背景墙合成到视频中,打开『剪映』,导入刚刚制作好的照片墙视频,再导入一首喜欢的背景音乐就好啦。

交流群

时隔2个月,摸鱼学习交流群再次限时开放了。

e9008f520e34ce6081c41cdc8be871ea.png

Python技术交流群(技术交流、摸鱼、白嫖课程为主)又不定时开放了,感兴趣的朋友,可以在下方公号内回复:666,即可进入,一起 100 天计划!

老规矩,酱友们还记得么,右下角的 “在看” 点一下,如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!

b95a517529906d8db76bdc22d93df113.gif

【神秘礼包获取方式】
扫描下方二维码添加私人微信,再送一套精华电子书!,回复:电子书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java开发中PO、VO、DAO、BO、DTO、POJO 含义

PO(persistant object) 持久对象 可以看成是与数据库中的表相映射的java对象。使用 Mybatis 来生成 PO 是不错的选择。 VO(value object) 值对象 通常用于业务层之间的数据传递,和 PO 一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应&am…

最强提示词技巧,没有之一!(全网首发)

我们总是希望AI按照我们的要求来进行回复。 通常,当回复不符合预期的时候,我们需要通过不断优化提示词,让AI慢慢学习,慢慢领悟我们的意图,直到符合我们的预期。而这个过程,往往需要长时间多轮往复。 举个栗…

【网络原理】初学网络必备知识

🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。 🤼专栏收录于:计算机网络原理 本期讲解什么是局域网与广域网,网络通信基础知识之IP地址、端口号、协议、五元组。…

springboot第25集:实体类定义规则

PO:持久化对象,一个PO对象对应一张表里面的一条记录。全部对应 VO:View视图对象,用来在页面中展示数据的,页面需要哪些字段属性就添加哪些,查询出来之后赋值操作比PO对象要简单。所以提高性能。 DTO&#x…

paddle 目标检测C++部署流程

1 源码下载以及依赖库 PaddleDetectionopencv3.4.6paddle_inference10.2 2 C 编译流程 手动配置cmake的依赖库路径 报错1 报错2 报错3 编译结果 3 测试 略

梵想 S690MQ 4TB固态尝鲜,我的磁盘空间又充裕了

先上一张我的工作电脑磁盘空间图,系统盘装了非常多的开发环境非常吃紧,数据盘D盘存着大部分虚拟机估计再过没多久也要告急了,之前磁盘已经红过一次,清理了下微信聊天记录感觉还能挺几个月。 对于爱折腾系统的我 1.5T 的磁盘空间已…

数据库的增删改查(二)

1、数据库约束 关系型数据库的一个重要功能 主要作用是保证数据的完整性,也就是数据的正确性(数据本身是正确的,关联关系也是正确的) 人工检查数据的完整性的工作量非常的大,在数据表定义一些约束,那数据…

从“制造”到“智造”!宏工科技发布“宏梦智能制造云”新产品

产业周期性变化正在给锂电产业带来深刻变革。6月7日,宏工科技在2023高工锂电材料大会上发表演讲表示,宏工科技推出了“宏梦智能制造云”,以整线一体化智造思路,赋能电池材料生产智造转型。 全球电动化与储能市场双轮驱动&#xff…

GPS跟踪系统Traccar

什么是 Traccar ? Traccar是一个开源的 GPS 跟踪系统。支持 200多种GPS 协议和 2000 多种型号的 GPS 跟踪设备。当然也包括像 iOS/Android 这样的手机设备,手机设备只需要安装Traccar的客户端即可使用。 前文介绍的 Hauk 只支持 Android 客户端&#xff…

数据分析第13课Matplotlib可视化

官网:https://matplotlib.org/users/installing.html 04-1Matplotlib介绍与安装 Matplotlib介绍 什么是Matplotlib Matplotlib是一个Python的基础绘图库,它可与 NumPy(科学计算的) 一起使用,代替Matlab(计算很好)使用。 为什么要学习Matplotlib(灵活度高) 将数据…

AutoHotKey文件与路径交互操作

文章目录 路径操作文件选择文件读写文件属性 AHK作为一种脚本语言,其功能特点是对操作系统功能的整合与简化,从而缩减操作流程,从而起到提高效率的目的。鼠标、键盘的映射,相当于是对外设操作的简化,而除了外部交互之外…

docker harbor私有仓库部署

docker harbor私有仓库部署 docker system prune -a 删除停掉的服务,自定义网络等。 docker 私有仓库 docker配置文件 vim /etc/docker.daemon.josn { “insecury-registries”: ["192.168.232.10:5000],#指定私有仓库 } docker pull/push 19…

chatgpt赋能python:Python中引入其他包的指南

Python中引入其他包的指南 Python是一种流行的编程语言,拥有丰富的开源软件包和库。许多Python程序将使用其他包来增强其功能。在本文中,我们将探讨如何在Python项目中使用和引入其他包。 什么是Python包和库? Python包是一组可重复使用的…

冈萨雷斯DIP第7章知识点

文章目录 7.3 相关7.5 基图像7.6 傅里叶相关变换7.6.1 离散哈特利变换7.6.3 离散正弦变换 DIP的其他章节都好复习,唯独就这个第7章小波变换。复习起来十分头大,所以我开始写他的课后题,雾。 7.3 相关 已知两个连续函数 f ( x ) f(x) f(x) …

单链表【数据结构、数组模拟】

不采用动态链表 一般情况下,都是直接使用下面的代码进行模拟的 struct Node{int val;Node *next; }然后当我们需要进行创建一个新的节点时,都需要使用new Node(),非常慢!!! 数据规模一般都是10w~100w的数…

Android性能分析工具:Perfetto介绍及用法

本文字数:8409字 预计阅读时间:22分钟 概念 什么是Perfetto?Perfetto是Android 10中引入的全新平台级跟踪工具。这是适用于Android、Linux和Chrome的更加通用和复杂的开源跟踪项目。与Systrace不同,它提供数据源超集,可让您以pro…

【6.09 代随_52day】 最长递增子序列、最长连续递增序列、最长重复子数组

最长递增子序列、最长连续递增序列、最长重复子数组 最长递增子序列1.方法图解步骤递归代码 最长连续递增序列1.动态规划的方法图解步骤代码 最长重复子数组图解步骤代码 最长递增子序列 力扣连接:300. 最长递增子序列(中等) 1.方法 dp[i]…

开源 Golang 微服务入门三:ORM 框架 GORM

前言 前两篇笔记分别介绍了 Golang 微服务 HTTP 框架 Hertz 和 Golang 微服务 RPC 框架 Kitex,本文将要介绍面向ORM(持久层)框架 GORM。 官方文档 GORM 是面向 Golang 语言的一种 ORM(持久层)框架,支持多种数据库的接入,例如 MySQL&#x…

【TCP/IP】多进程服务器的实现(进阶) - 僵尸进程及wait、waitpid函数

目录 僵尸(Zombie)进程 僵尸进程的产生机制 僵尸进程的危害 僵尸进程的销毁 wait函数 waitpid函数 进程管理在网络编程中十分重要,如果未处理好,将会导致出现“僵尸进程”,进而影响服务器端对进程的管控。 僵尸(Zombie)进程 第一次听到…

继万物分割SAM之后,万物识别模型RAM来了!

Recognize Anything: A Strong Image Tagging Model 提出“识别万物模型”(Recognize Anything Model,RAM),用于图像打标签。RAM 可以高精度地识别任何常见类别。RAM 引入了图像打标签的一个新范式,利用大规模的图像-文…