当前位置: 首页 > news >正文

【Python黑科技】把秘密写在照片里(保姆级图文+实现代码)

目录

    • 实现效果
      • 小图片
      • 大图片
    • 图片素材和源码
    • 实现思路
    • 实现代码
    • 总结


欢迎关注 『Python黑科技』 系列,持续更新中
欢迎关注 『Python黑科技』 系列,持续更新中

实现效果

图片大小会变大(长宽和占用空间都变大)。

小图片

像素点太少,效果不是很理想

  • 效果对比
    在这里插入图片描述

  • 局部放大细节
    在这里插入图片描述

大图片

大图片明显效果好,但是注意,如果图片太大了,绘制的时间比较久,甚至出现python报错MemoryError
我这还是300KB的图片,我试了一个8MB就不行了。

  • 效果对比
    在这里插入图片描述

  • 局部放大细节
    在这里插入图片描述


图片素材和源码

已经上传至我的gitee仓库
python黑科技
在这里插入图片描述


实现思路

  • 导入图片,图片与py文件在同一文件夹路径下
  • 导入字体,绘制字体小图
  • 遍历绘图,用字体小图替换大图照片中的像素点。要等待很久,如果你的图片比较大的话(我300KB的图要等1分钟左右,可能是我的老年机的问题吧)

实现代码

import time

from  PIL import Image,ImageDraw,ImageFont
from PIL import Image,ImageFile

img_king_size = 20#像素放大尺寸,会影响大小
text = '发现你走远了'#输入文字内容
font = ImageFont.truetype('simsun.ttc',img_king_size)#设置字体

#导入图片,
#注意,这个图片有大小要求,我300Kb的图片变成了37mb,而且运行了很久,如果你的图片很大,python会报内存错误MemoryError
#但是像素点太少颜色对比不明显的图片虽然很快运行成功但是效果很差,不明显,所以要做好取舍。
#imgName=input("请输入图片名称:\n")
imgName = 'bigPhoto.jpg'

#打开图片
img = Image.open(imgName)
img_w,img_h = img.size

#创建一个小图,用于填充字体
img_child = Image.new("RGB", (img_king_size, img_king_size))
#创建一个大图,装备用来填充小图字体
img_ans = Image.new("RGB",(img_w * img_king_size,img_h * img_king_size))

#获取单个文字的宽和高
text_w,text_h = font.getsize('中')
#文字水平居中
offset_x = (img_king_size - text_w) >> 1
#文字垂直居中
offset_y = (img_king_size - text_h) >> 1

char_index = 0

draw = ImageDraw.Draw(img_child)#小图用于绘制文字

print("图片开始绘制,可能要很久,请耐心等待")
#遍历原图的每一个像素点,把像素点换为文字
for x in range(img_w):
    for y in range(img_h):
        #绘制背景,让图片更好看
        draw.rectangle((0,0,img_king_size,img_king_size),fill = 'lightgray')
        #用(x,y)处的像素点的色值进行绘制字体
        draw.text((offset_x,offset_y),text[char_index],font = font,fill = img.getpixel((x,y)))
        img_ans.paste(img_child,(x * img_king_size,y * img_king_size))
        char_index = (char_index + 1) % len(text)

timeNow=time.strftime("%Y-%m-%d-%H-%M-%S-",time.localtime(int(time.time())))#获取当前时间
img_ans.save("有秘密的-"+timeNow+imgName)
print("图片保存成功")


总结

大家喜欢的话,给个👍,点个关注!给大家分享更多有趣好玩的Python黑科技!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2022 mzh

Crated:2022-2-1

欢迎关注 『Python黑科技』 系列,持续更新中
欢迎关注 『Python黑科技』 系列,持续更新中
【Python黑科技】tkinter库实战7个小项目合集(保姆级图文+实现代码)
【Python黑科技】tkinter库实战制作一个计算器(保姆级图文+实现代码)
【Python黑科技】tkinter库实战制作一个记事本(保姆级图文+实现代码)
【Python黑科技】tkinter库实战用户的注册和登录(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“2048”小游戏(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“俄罗斯方块”小游戏(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“贪吃蛇”小游戏(保姆级图文+实现代码)
【Python黑科技】tkinter库实战“连连看”小游戏(保姆级图文+实现代码)

【Python安装第三方库一行命令永久提高速度】
【使用PyInstaller打包exe】
【免登陆爬虫一键下载知乎文章图片(保姆级图文+实现代码)】
【孤独的程序员和AI机器人朋友聊天解闷(免费接口+保姆级图文+实现代码注释)】
【几行代码绘制gif动图(保姆级图文+实现代码)】
【几行代码实现网课定时循环截屏,保存重要知识点(保姆级图文+实现代码)】
【常用的user_agent 浏览器头爬虫模拟用户(保姆级图文+实现代码)】
【更多内容敬请期待】


相关文章:

  • OpenGL ES学习(7)——混合
  • Spoon Kettle 连接之记录集连接详解(Merge join)
  • 光传送网管控融合研究与智能化演进思考
  • 应对三大行业痛点,利尔达用芯打造智能换电系统平台
  • RedHat Linux修改SSHD默认22端口
  • Docker: hello world
  • 08.文件操作
  • linux上redis单机的安装
  • 云服务器CentOS8 安装 Oracle19c
  • 沃尔玛、eBay、wish、新蛋等美系平台对于测评风控点有哪些?怎么解决
  • 霸道 阿里最新版Spring Cloud Alibaba项目文档,竟将重要组件弃用
  • lightdb22.3-oracle系统视图兼容增强
  • 【大数据】Hadoop三大核心组件入门
  • Jackson别名@JsonAlias详细用法
  • 机器学习(二十八):灰狼优化算法对神经网络的优化
  • (三)从jvm层面了解线程的启动和停止
  • If…else
  • java 多线程基础, 我觉得还是有必要看看的
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • PHP变量
  • SpringCloud集成分布式事务LCN (一)
  • springMvc学习笔记(2)
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 如何使用 JavaScript 解析 URL
  • 思否第一天
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 如何正确理解,内页权重高于首页?
  • ​力扣解法汇总946-验证栈序列
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (12)目标检测_SSD基于pytorch搭建代码
  • (规划)24届春招和25届暑假实习路线准备规划
  • (一)appium-desktop定位元素原理
  • (原)本想说脏话,奈何已放下
  • (转)【Hibernate总结系列】使用举例
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ***检测工具之RKHunter AIDE
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net 反编译_.net反编译的相关问题
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET/C# 的字符串暂存池
  • .NET委托:一个关于C#的睡前故事
  • .NET序列化 serializable,反序列化
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [].slice.call()将类数组转化为真正的数组
  • [Android View] 可绘制形状 (Shape Xml)
  • [BZOJ] 2044: 三维导弹拦截
  • [C++] 统计程序耗时
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]