NBA直播:

球星卡可以划分为5个部分球员姓名球队logo底板背景图

更新时间:
2024-03-11 09:56:03

我们先来看一张明星卡:

球星大全图片_球星图片和名字_nba球星图片大全

这种星卡可以分为5部分

球员动作图片、球员姓名、球队标志、底板背景图片、装饰边框图片

我们今天要做的就是找到这5种材料,然后将它们组合起来。 那么这个时候肯定有大佬有疑问了。 用PS把它们结合起来不是更好吗? 按理来说,这确实是方便又快捷。 但前提是你只做这一张卡。 当你想要为联盟450名左右的球员制作明星卡时,你需要一个脚本来帮助你完成(我对PS不熟悉,如果PS也能做到,你可以告诉我哈)。

这篇文章需要一些基础知识。 完全不懂的人最好先了解一些基础知识再看。

好的,让我们开始吧!

准备材料

正如一开始提到的,我们需要 5 种材料。 我将提供这5个材料中的几个供大家练习。

球星图片和名字_球星大全图片_nba球星图片大全

上图其实只有4个素材,另外一个是选手的名字。 我们可以在组合过程中使用并加载玩家的名字。

为了避免字体路径和中文乱码的问题,我还提供了微软雅黑字体。

材料可以在此处克隆或下载。 免责声明:本文涉及的所有素材及图片仅供交流学习之用。

开始写代码

我们的场景是为联盟中的所有球员制作明星卡,那么所有球员自然会从数据库中被检查出来。 为了练习,我们可以模拟一些数据(虽然,公平地说,波什不能放在SUPER里面,这里只有一张装饰框图片,所以勉强和我皇帝放在同一水平)。

mock_data = [
    {
        'id': 1966,
        'cn_name': '勒布朗-詹姆斯',
        'team_id': 5,
        'category': 'SUPER'
    },
    {
        'id': 1977,
        'cn_name': '克里斯-波什',
        'team_id': 14,
        'category': 'SUPER'
    }
]

当我们有了数据后,我们会遍历这些球员,找到我们需要的属性,然后将它们传递给组合函数。

def compose_all(all):
    for player in all:
        id = player['id']
        # if id == 1966:
        if True:
            category = player['category']
            player_img =  str(id) + '.png'
            team_id = player['team_id']
            team_img = str(team_id) + '.png'
            name = player['cn_name']
            category = player_category.index(category) + 1
            category_img = 'card_bg_' + str(category) + '.png'
            output_name = str(id) + '.png'
            print('start compose ' + str(id))
            compose(player_img, name, team_img, category_img, output_name)

我这里有一个个人习惯,因为我经常在服务器上写一些脚本。 All if True: 地方都用于调试。 当玩家调试没有问题时,将其注释掉并运行代码。 这样您就不必调整缩进。 不,我不知道其他大佬喜欢写这个地方。

这里我会默认对玩家进行分类(根据一些数据信息)

player_category = ["SUPER", "CORE", "BLUE", "SIX", "BENCH"]

齿轮等级对应的装饰边框有.png、.png等。

检查5个材料是否全部获取:

球员动作图片 -> 球员姓名 -> 球队标志名称 -> 底板背景图片 -> 无装饰边框图片 -> .png(n对应齿轮)

仍然需要底板背景图像。 由于每个玩家的底板背景图片都是相同的,因此可以直接在组合功能中使用。

在我们组合星卡之前,还有一个问题需要解决,那就是我们无法保证所有的素材都在同一个目录下,所以我们需要为每个素材指定一个目录,这样我们组合的时候星卡可以一帆风顺。

team_path = './logo/'
player_path = './player_img/'
output_path = './trading_cards/'
font_file = './assets/msyh.ttf'
card_decorate_path = './assets/'

设置好路径后,编写我们的组合函数。 为了保证这个功能的正常运行nba球星图片大全,我们需要导入三个模块。

import os
import numpy as np
from PIL import Image, ImageFont, ImageDraw

如果提示没有找到模块,请使用以下命令安装

pip install Pillow
pip install numpy

关于图像处理的详细文档,请参考

这是我们的组合函数

def compose(player_img, name, team_logo, category_img, output_name):
    card_bg = card_decorate_path + 'bg.png'
    player_img_offset_height = 15
    if not os.path.isfile(player_path + player_img):
        need_manual_compose.append(player_img)
        print(player_path + player_img + ' is not exist')
        return
    player_img = Image.open(player_path + player_img).convert('RGBA')
    bg_img = Image.open(card_decorate_path + category_img).convert('RGBA')
    card_bg_img = Image.open(card_bg).convert('RGBA')
    logo = Image.open(team_path + team_logo).convert('RGBA')
    logo = logo.resize((100,100), Image.ANTIALIAS)
    card_bg_img.paste(player_img, (35,player_img_offset_height), player_img)
    card_bg_img.paste(bg_img, (0,0), bg_img)
    card_bg_img.paste(logo, (95,315), logo)
    font = ImageFont.truetype(font_file, 20)
    d = ImageDraw.Draw(card_bg_img)
    try:
        name = unicode(name, 'utf-8')
    except NameError:
        name = name
    d.text((12, 12), name, font=font, fill=(255,255,255))
    card_bg_img.save(output_path + output_name, quality=100)

有几个问题需要澄清:

有些明星动作的素材可能找不到,所以找不到的玩家会被记录下来,最后手动处理。 因为我们需要使用alpha通道,所以在图像粘贴之前我们需要('RGBA')来保证质量和粘贴范围的像素相同。 如果不同,则使用该函数使它们相同。 图像的功能。 参数是抗锯齿的nba球星图片大全,所以生成的图像的边缘会更圆润。 将b图片粘贴到a图片上,使用a.paste(b, (x,y), b),(x,y)是左上角的坐标nba球星图片大全,第三个参数b作为遮罩,如果这个参数不使用的话,就会导致b图的透明部分也覆盖在a图的上面。 该程序可以在 和 上运行。

好的,我们来看看结果

球星图片和名字_nba球星图片大全_球星大全图片

嗯,看起来还不错,但是大家会发现波什的手没了,所以说一切平坦都是骗人的。

经过我个人的观察,我会发现大部分明星的动作图片都与詹姆斯类似(即球员的动作位于图片的下方)。 如果坐标向下粘贴,就会出现星卡的主要局部区域。 大面积的空白。 如果第一个计划失败了,我们可以尝试另一个计划。 我们可以对类似波什的动作人物进行特殊处理,将其粘贴坐标向下移动。

好吧,问题来了。 人眼一眼就能看出哪个人偶较高,哪个人偶较低。 那么我们怎么知道呢?

球星图片和名字_球星大全图片_nba球星图片大全

可以看到,每个动作图片的大小是相同的,但是具体动作在图片中的分布是不同的。

这时候我们就需要numpy库来帮助我们将图片转化为像素矩阵。 然后我们逐行扫描矩阵,记录有效像素出现的位置,这样就可以判断哪些动作图片高。

def calculateUsefulHeight(img):
    img = Image.open(player_path + img).convert('RGBA')
    w, h = img.size
    mat = np.array(img)
    for i in range(mat.shape[0]):
        if not allEqual(mat[i]):
            return h - i
def allEqual(line):
    w = len(line)
    if not w:
        return True
    init_value = line[0][3]
    step = 10
    for i in range(int(round(w/step))):
        if line[i * step][3] == init_value:
            continue
        else:
            return False
    return True

然后只需在组合函数中添加对动作图高度进行特殊处理的代码即可。

def compose(player_img, name, team_logo, category_img, output_name):
    ...
    # deal with high player image
    h = calculateUsefulHeight(player_img)
    # 这个地方的310是球星卡展示球员动作的最大高度
    if h > 310:
        offset = h - 310
        player_img_offset_height += offset

再次运行它,看看它是如何工作的。

球星图片和名字_球星大全图片_nba球星图片大全

是的,这就足够了,尤其是当450张看起来不错的星卡瞬间就出来了,那是非常爽的。

好的,应该到这里了。 源代码可以在这里获取,其中包含了本文涉及到的所有图片、资料和代码。

如果大家有更好的设计和布局,请随时与我交流。

本文标签: nba球星图片大全
上一条:TCL携手幸运球迷探访深圳新世纪烈豹俱乐部
下一条:CBA-国产内线韩德君VS易建联观战指南与厮杀

相关篮球快讯


NBA直播吧提供的足球比分数据,比分直播数据等相关信息仅供体育爱好者浏览、购买中国体彩参考之用。任何人不得用于非法用途,否则责任自负。
Copyright ©2023-2028 NBA直播吧 版权所有 XML地图 备案号:桂ICP备2024020531号