MindSpore创意实践:基于深度学习的智能Logo生成器(上)

案例介绍

在数字化营销时代,一个独特的品牌Logo对于企业形象至关重要。传统Logo设计需要专业设计师投入大量时间,而今天我们将展示如何利用华为昇思MindSpore框架,构建一个智能Logo生成器,让AI成为你的设计助手。

核心思路:

我们的智能Logo生成器基于以下设计理念:零样本学习:无需训练数据,直接根据文本生成Logo,确定性生成:相同输入始终产生相同输出,保证一致性,自适应设计:根据文本长度自动调整布局和样式。

技术栈:

深度学习框架:MindSpore,图像处理:PIL (Python Imaging Library),数值计算:NumPy,可视化:Matplotlib。

环境设置

import mindspore as ms
import mindspore.nn as nn
import mindspore.ops as ops
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import matplotlib.pyplot as plt
import os
# 设置环境
ms.set_context(mode=ms.PYNATIVE_MODE, device_target="CPU")

颜色方案生成和智能渐变背景

使用文本哈希值确保颜色方案的一致性,预定义8种专业配色方案,覆盖不同行业风格,主色与辅色搭配,确保视觉层次感。
径向渐变营造专业感和深度,动态计算每个像素的颜色值,渐变强度可调节,适应不同设计需求。

class TextToLogoGenerator(nn.Cell):
    def __init__(self, text):
        super(TextToLogoGenerator, self).__init__()
        self.text = text
        
    def construct(self):
        # 创建基础画布 - 更大的尺寸确保文字清晰
        width, height = 400, 200
        image = np.ones((height, width, 3), dtype=np.uint8) * 255
        
        # 根据文本生成颜色方案
        colors = self._generate_colors_from_text(self.text)
        bg_color, accent_color = colors
        
        # 设置背景色 - 使用渐变效果
        for i in range(height):
            for j in range(width):
                # 创建径向渐变效果
                center_x, center_y = width // 2, height // 2
                distance = np.sqrt((j - center_x) ** 2 + (i - center_y) ** 2)
                max_distance = np.sqrt(center_x ** 2 + center_y ** 2)
                
                # 渐变强度
                intensity = 1 - (distance / max_distance) * 0.3
                pixel_color = [
                    int(bg_color[k] * intensity) for k in range(3)
                ]
                image[i, j] = pixel_color
        
        return image, bg_color, accent_color
    
    def _generate_colors_from_text(self, text):
        """根据文本生成配色方案"""
        hash_val = abs(hash(text)) % 8
        
        color_schemes = [
            [(25, 130, 196), (255, 223, 0)],    # 蓝色 + 金色
            [(46, 125, 50), (255, 255, 255)],   # 绿色 + 白色
            [(198, 40, 40), (255, 255, 255)],   # 红色 + 白色
            [(255, 152, 0), (33, 33, 33)],      # 橙色 + 黑色
            [(123, 31, 162), (255, 255, 255)],  # 紫色 + 白色
            [(0, 151, 167), (255, 255, 255)],   # 青色 + 白色
            [(121, 85, 72), (255, 245, 157)],   # 棕色 + 浅黄
            [(57, 73, 171), (255, 255, 255)],   # 深蓝 + 白色
        ]
        
        return color_schemes[hash_val]

自适应文字布局和视觉增强效果

智能字体大小调整,确保文字可读性,自动计算文字居中位置,支持中英文混合输入。

多层阴影技术提升文字可读性,自动对比度检测,确保文字清晰,装饰边框和角标增强专业感。

def get_best_font(font_size):
    """获取可用的字体"""
    font_paths = [
        "youshebiaotihei.ttf",
        "arial.ttf",
        "arialbd.ttf",
        "arialbi.ttf",
        "ariali.ttf",
        "ariblk.ttf",
        "msyh.ttc",
        "msyhbd.ttc",
        "msyhl.ttc"
    ]
    
    for font_path in font_paths:
        try:
            return ImageFont.truetype(font_path, font_size)
        except:
            continue
    
    # 如果都找不到,使用默认字体
    return ImageFont.load_default()

def create_logo_with_text(ad_text, output_path="generated_logo.png"):
    """生成带文字的Logo"""
    
    print(f"正在为 '{ad_text}' 设计Logo...")
    
    # 创建基础Logo图像
    generator = TextToLogoGenerator(ad_text)
    logo_array, bg_color, accent_color = generator.construct()
    
    # 转换为PIL图像
    logo_img = Image.fromarray(logo_array)
    draw = ImageDraw.Draw(logo_img)
    
    # 根据文本长度调整字体大小
    text_length = len(ad_text)
    if text_length <= 2:
        font_size = 60
    elif text_length <= 4:
        font_size = 48
    elif text_length <= 6:
        font_size = 36
    elif text_length <= 8:
        font_size = 30
    else:
        font_size = 24
    
    # 获取字体
    font = get_best_font(font_size)
    
    # 计算文本位置
    try:
        bbox = draw.textbbox((0, 0), ad_text, font=font)
        text_width = bbox[2] - bbox[0]
        text_height = bbox[3] - bbox[1]
    except:
        # 备用计算方法
        text_width = text_length * font_size * 0.7
        text_height = font_size * 1.2
    
    x = (logo_img.width - text_width) // 2
    y = (logo_img.height - text_height) // 2
    
    # 确定文字颜色(确保与背景对比度)
    bg_brightness = sum(bg_color) / 3
    if bg_brightness > 150:
        text_color = (0, 0, 0)  # 深色文字
        shadow_color = (255, 255, 255, 128)  # 白色阴影
    else:
        text_color = (255, 255, 255)  # 白色文字
        shadow_color = (0, 0, 0, 128)  # 黑色阴影
    
    # 添加文字阴影(多层阴影增强立体感)
    shadow_offset = 3
    for offset_x, offset_y in [(shadow_offset, shadow_offset), 
                              (-shadow_offset, shadow_offset),
                              (shadow_offset, -shadow_offset),
                              (-shadow_offset, -shadow_offset)]:
        draw.text((x + offset_x, y + offset_y), ad_text, font=font, fill=shadow_color)
    
    # 添加主文字
    draw.text((x, y), ad_text, font=font, fill=text_color)
    
    # 添加装饰边框
    border_width = 4
    draw.rectangle([border_width, border_width, 
                   logo_img.width - border_width - 1, 
                   logo_img.height - border_width - 1], 
                   outline=accent_color, width=border_width)
    
    # 添加内部装饰线
    inner_border = border_width + 8
    draw.rectangle([inner_border, inner_border,
                   logo_img.width - inner_border - 1,
                   logo_img.height - inner_border - 1],
                   outline=text_color, width=2)
    
    # 在角落添加装饰元素
    corner_size = 15
    corners = [
        (corner_size, corner_size),
        (logo_img.width - corner_size - 1, corner_size),
        (corner_size, logo_img.height - corner_size - 1),
        (logo_img.width - corner_size - 1, logo_img.height - corner_size - 1)
    ]
    
    for corner_x, corner_y in corners:
        draw.rectangle([corner_x, corner_y, 
                       corner_x + corner_size // 2, 
                       corner_y + corner_size // 2],
                       fill=accent_color)
    
    # 保存Logo
    logo_img.save(output_path, "PNG")
    print(f"✅ Logo已保存为: {output_path}")
    
    return logo_img

本地字体文件:

MindSpore创意实践:基于深度学习的智能Logo生成器(下)

1 Like