美文网首页
Python使用png图片生成MapboxGL雪碧图

Python使用png图片生成MapboxGL雪碧图

作者: happy_port | 来源:发表于2020-06-11 11:40 被阅读0次

在mapboxgl中,使用sprite雪碧图实现图标渲染是比较常见的方式。对于自己制作定义的图标如何生成雪碧图,本文采用Python语言实现了该过程(考虑到每个png图标的大小不同),在代码中出现的python包,请先安装。

import os

import glob

from PIL import Image

import json

#图片集地址,支持不同文件夹下的png图片合并

IMAGES_PATH = r'D:\sprite_allsvg\sprite_s\\*\\'

# 图片格式

IMAGES_FORMAT = '*.png'  

#合并后的列数

SPRITE_IMAGE_COLUMNS = 18

SPRITE_IMAGE_PATH = r'D:\sprite_allsvg\sprite_s\sprite.png'

SPRITE_JSON_PATH = r'D:\sprite_allsvg\sprite_s\sprite.json'

def walk_type(path, file_type):

    path_dir = os.path.join(path, file_type)

    #path下所有file_type类型的文件的路径列表

    paths = glob.glob(path_dir)

    return paths

#图片拼接

def merge_images():

    image_names = walk_type(IMAGES_PATH, IMAGES_FORMAT)

    images_count = len(image_names)

    sprite_image_rows = int(images_count / SPRITE_IMAGE_COLUMNS) + 1

    max_width = 0

    max_height = 0

    row_width = 0

    row_height = 0

    #存储{image:image,x:x,y:y,name:name}

    images = []

    try:

        for row in range(sprite_image_rows+1):

            if (row_width > max_width):

                max_width = row_width

            row_width = 0

            max_height += row_height

            row_height = 0

            for col in range(SPRITE_IMAGE_COLUMNS+1):

                num = row * SPRITE_IMAGE_COLUMNS + col

                if (num > images_count - 1):

                    break

                image =Image.open(image_names[num]) 

                image_width, image_height = image.size

                images.append({

                    'image': image,

                    'x': row_width,

                    'y': max_height,

                    'name':os.path.basename(image_names[num]) .split('.')[0]

                })

                if (image_height > row_height):

                    row_height = image_height

                row_width += image_width

        if (row_width > max_width):

            max_width = row_width

        max_height += row_height

        # 创建一个新图

        sprite_image = Image.new('RGBA', (max_width, max_height), (255,255,255,255))

        #写入内容

        json_img = {}

        for from_img in images:

            image=from_img['image']

            sprite_image.paste(image, (from_img['x'], from_img['y']))

            json_img[from_img['name']]={

                    'height': image.height,

                    'width': image.width,

                    'pixelRatio': 1,

                    'x': from_img['x'],

                    'y': from_img['y']

            }

        sprite_image.save(SPRITE_IMAGE_PATH)

        with open(SPRITE_JSON_PATH, 'w', encoding='utf-8') as file:

            #ensure_ascii=False可以消除json包含中文的乱码问题

            file.write(json.dumps(json_img,indent=2, ensure_ascii=False))

        print("转换成功")

    except Exception:

       print('traceback.format_exc():\n%s' % traceback.format_exc())

       print("转换失败")

#调用

merge_images()

相关文章

  • Python使用png图片生成MapboxGL雪碧图

    在mapboxgl中,使用sprite雪碧图实现图标渲染是比较常见的方式。对于自己制作定义的图标如何生成雪碧图,本...

  • 将png图片序列生成雪碧图

    一、前置步骤 首先,我们需要知道的是,Gulp和所有Gulp插件都是基于nodeJS来运行的,所以需要电脑首先安装...

  • openlayers5-加载geojson数据,并用icon s

    resolution为分辨率/img/sprite.png为合成的雪碧图(sprite图片)

  • #第二十七天#生成Sprite 雪碧图方法

    1、使用exe小工具,csdn上有人分享,可以通过选择图片自动生成雪碧图,优点是选择图片方便,缺点是需要安装,并且...

  • css使用背景灵活展示雪碧图

    雪碧图是把各种小图标集合在一起的png图片,通过background-position来展示雪碧图中不同位置的小图...

  • CSS Sprite

    雪碧图的优点 减少了HTTP请求的数目,内容显示更快。 使用雪碧图的场景 静态图片,不随时间变化。 小图片,图片容...

  • base64格式的图片转换为file 文件格式

    在项目中用到使用canvas生成图片功能(canvas.toDataURL("image/png")),生成的图片...

  • 雪碧图和background属性

    雪碧图 就是将网页制作中使用的多个小图片合并成一个图片,使用css计数将这张合成的图片应用在网页不同的地方,雪碧图...

  • 设置元素的背景

    雪碧图被运用在众多使用了很多小图标的网站上。相对于把每张小图标以.png格式文件的形式引用到页面上,使用雪碧图只需...

  • 前端通用性能优化总结

    一.图片优化 1.使用雪碧图(webpack和gulp都有对应插件自动转换成雪碧图),减少请求。2.压缩图片质量(...

网友评论

      本文标题:Python使用png图片生成MapboxGL雪碧图

      本文链接:https://www.haomeiwen.com/subject/zgtbtktx.html