图像与文字的创意融合:使用Python进行视觉艺术创作

原图:

处理过的:

python 复制代码
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import os

# 字体文件路径
vfont = './fonts/方正像素字体.ttf'

def text_paint(img_path, text, font_path, font_size):
    # 使用 OpenCV 加载图片
    img = cv2.imread(img_path)
    if img is None:
        raise Exception("无法加载图片,请检查图片路径是否正确")
    
    # 放大图片为原来的2倍
    img = cv2.resize(img, (img.shape[1]*2, img.shape[0]*2), interpolation=cv2.INTER_LINEAR)
    
    # 检查字体文件是否存在
    try:
        if os.path.exists(font_path):
            font = ImageFont.truetype(font_path, font_size)
        else:
            font = ImageFont.truetype(vfont, font_size)
    except Exception as e:
        print(f"加载字体失败: {e}")
        font = ImageFont.load_default()

    # 获取文字的实际大小
    test_text = text
    bbox = font.getbbox(test_text)
    char_width = bbox[2] - bbox[0]
    char_height = bbox[3] - bbox[1]

    # 创建一个新的白底图片(2倍大小)
    new_img = Image.new('RGB', (img.shape[1], img.shape[0]), 'white')
    draw = ImageDraw.Draw(new_img)
    
    # 遍历图片的每个字符位置,使用实际字符大小
    for y in range(0, img.shape[0], char_height):
        for x in range(0, img.shape[1], char_width):
            # 获取当前区域的平均颜色
            if y < img.shape[0] and x < img.shape[1]:
                # 计算区域范围
                y_end = min(y + char_height, img.shape[0])
                x_end = min(x + char_width, img.shape[1])
                # 获取区域的平均颜色
                region = img[y:y_end, x:x_end]
                avg_color = np.mean(region, axis=(0, 1))
                color = tuple(map(int, avg_color[::-1]))  # BGR转RGB并转为整数
                # 用平均颜色绘制文字
                draw.text((x, y), text, font=font, fill=color)
    
    # 保存和显示图片
    new_img.save('output.jpg')
    new_img.show()

# 使用示例
text_paint('./2.png', 'a', vfont, 8)

功能解析

  • 图片加载和放大:首先使用OpenCV加载图片,如果图片不存在则抛出异常。然后将图片放大到原来的两倍,以便在更大的画布上绘制。
  • 字体加载:检查指定的字体文件是否存在,如果不存在则使用备用字体。
  • 文字大小获取:获取指定文字的实际大小,以便确定在图片上绘制文字的间隔。
  • 新图片创建:创建一个新的白色背景图片,大小为原图片的两倍。
  • 颜色计算和文字绘制:遍历图片的每个区域,计算该区域的平均颜色,并用这种颜色在新图片上绘制文字。
  • 图片保存和显示:最后,将处理后的图片保存并显示。

这个函数可以用于各种创意项目,例如生成艺术效果的图片或者进行视觉设计实验。

相关推荐
IT_Octopus1 小时前
【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版
人工智能·python·langchain
2603_965148111 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
程序猿追2 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓2 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播2 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
CCblandy3 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
墨云安全3 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php
摇滚侠3 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y4 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
拿本唠嗑AI研究4 小时前
本体工程实战指南:从建模到可维护的完整落地路径
java·人工智能·python·jena·ontology