python 制作3d立体隐藏图

生成文件的3d图,例子:

文字:

隐藏图:

使用建议:

1、建议不用中文,因为中文太复杂,生成立体图效果不好。

2、需要指定FONT_PATH,为一个ttf文件,linux在/usr/share/fonts目录下,windows在C:\Windows\Fonts

3、建议字体TEXT_SIZE调大,不然不好分辨

4、指定的TEXT不要太长

5、多试几次,找到合适的纹理

python 复制代码
from PIL import Image, ImageDraw, ImageFont
from random import *
import numpy as np
from io import BytesIO


FONT_PATH = '/usr/share/fonts/dejavu/DejaVuSans.ttf'   # 字体位置,linux在/usr/share/fonts/,windows
TEXT = 'love yannis'
TEXT_SIZE = 100 # 字体大小
WIDTH = 100 + int(len(TEXT) * TEXT_SIZE / 1.8)
HEIGHT = 256
SHIFT = 4 # 叠加位移

# 生成纹理
def clamp(n, smallest, largest):
    return max(smallest, min(n, largest))

def rand_ratio(base=1, delta=1):
    return delta * randint(1,100)*1.0/100 + base

rand_ratios = [rand_ratio(), rand_ratio(), rand_ratio()]

color_starts = [randint(0,200), randint(0,200), randint(0,200)]

def rand_color(i):
    return clamp(randint(color_starts[i],int(rand_ratios[i] * color_starts[i])), 0, 255) 

def rand_colors():
    return (rand_color(0),rand_color(1),rand_color(2))

perodic_x = 40
perodic_y = 40
texture = np.zeros((perodic_x, perodic_y, 3))
same_to_last_x = [False] * perodic_x
same_to_last_y = [False] * perodic_y
for x in range(0, perodic_x):
    same_to_last_x[x] =  random() < 0.1
for y in range(0, perodic_y):
    same_to_last_y[y] =  random() < 0.3

texture[0][0] = rand_colors()

for x in range(0,perodic_x):
    if same_to_last_x[x]:
        texture[x][0] = texture[x-1][0]
    else:
        texture[x][0] = rand_colors()

# 纹理平铺
for x in range(0, perodic_x):
    for y in range(0,perodic_y):
        if same_to_last_y[y]:
            texture[x][y] = texture[x][y-1]
        elif same_to_last_x[x]:
            texture[x][y] = texture[x-1][y]
        else:
            texture[x][y] = rand_colors()

# 生成纹理平铺图片
img = Image.new('RGB', (WIDTH, HEIGHT), color = 'white')
img_draw = ImageDraw.Draw(img) 
for x in range(0, WIDTH):
    for y in range(0,HEIGHT):
        color = texture[x % perodic_x][y % perodic_y].astype(int).tolist()
        img_draw.point([x,y], fill = tuple(color))


# 生成文字
text = Image.new('RGB', (WIDTH, HEIGHT), color = 'black')
text_draw = ImageDraw.Draw(text) 
font = ImageFont.truetype(FONT_PATH, size=TEXT_SIZE)
text_draw.text((50,(HEIGHT-TEXT_SIZE)/2), TEXT, font=font, fill='white')

# 文字叠加
img_mat = np.asarray(img)
text_mat = np.asarray(text)

for x in range(0, WIDTH - SHIFT):
    for y in range(0, HEIGHT):
        if text_mat[y][x][0] != 0:
            img_draw.point([x,y], fill = tuple(img_mat[y, x - SHIFT].tolist()))
text.save('../tmp2.png', 'png')
img.save('../tmp.png', 'png')
相关推荐
leisoo80972 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
WangYan20222 小时前
基于XGBoost与AI的生态—地学多源数据建模:植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识别
python·机器学习·xgboost
不会代码的小猴2 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
一只旭宝3 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
金銀銅鐵4 小时前
[Python] 借助 turtle 逐字展示唐诗《金缕衣》
python
coder!mq5 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding5 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
Lhan.zzZ5 小时前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio
心平气和量大福大6 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
码哥DFS6 小时前
构造函数、实例对象、对象原型 ----三者关系
开发语言·javascript·原型模式