Python potrace 位图转矢量图

简介

使用potrace.exe可以把位图转化为svg然后上传到阿里云oss存储。

为什么要使用阿里云的oss存储呢?

因为需要转换的量实在太大了,超过200w张文件,磁盘的存储这么多文件在执行过程中会逐渐卡死,即使时使用的是ssd,故使用阿里云的oss,这样可以缓解磁盘性能引起的程序中断问题。

代码


import sys
import os
import oss2
import os

count = 0
num = 0;
endpoint = "";
accesskey_id = "";
accesskey_secret = "";
bucket_name = "";
bucket_name_svg = "";
#本地文件保存路径前缀

download_local_save_prefix = "./";

curss = 0;

'''
--------------------------------------------
OSS的操作
--------------------------------------------
'''
'''
列举prefix全部文件
'''
def prefix_all_list(bucket,bucket_svg,prefix):
    ## print("开始列举"+prefix+"全部文件");
		
    oss_file_size = 0;
		
    for obj in oss2.ObjectIterator(bucket, prefix ='%s/'%prefix):
        #print(' key : ' + obj.key)
        oss_file_size = oss_file_size + 1;
        download_to_local(bucket,bucket_svg, obj.key, obj.key);

    # print(prefix +" file size " + str(oss_file_size));

'''
列举全部的根目录文件夹、文件
'''
def root_directory_list(bucket,bucket_svg):
    global curss
    # 设置Delimiter参数为正斜线(/)。
    for obj in oss2.ObjectIterator(bucket, delimiter='/'):
        curss +=1
        if curss < 597253 :
            continue
        else:
            # 通过is_prefix方法判断obj是否为文件夹。
            if obj.is_prefix():  # 文件夹
                # print('directory: ' + obj.key);
								
                prefix_all_list(bucket,bucket_svg,str(obj.key).strip("/")); #去除/
            else:  # 文件
                # print('file: ' + obj.key);
								
                #下载根目录的单个文件
								
                download_to_local(bucket,bucket_svg, str(obj.key) , str(obj.key));

'''
下载文件到本地
'''
def download_to_local(bucket,bucket_svg,object_name,local_file):
    global count
    global num
    url = download_local_save_prefix  + local_file
    #文件名称
    file_name = url[url.rindex("/")+1:]
    filePreName = file_name.split('.')[0] 

    file_path_prefix = url.replace(file_name, "")
    if False == os.path.exists(file_path_prefix):
        os.makedirs(file_path_prefix);
        # print("directory don't not makedirs "+  file_path_prefix);
    
    # 找到新的svg文件的名字
    svgFileName = url[:url.rfind('.')] + ".svg"
    displaySvgFileName = svgFileName[svgFileName.find('.')+2:]

    # 检测文件是否存在
    # try:
    #     exist = bucket_svg.object_exists(displaySvgFileName)
    # except:
    #     print("这是个意外")

    exist = False
    num += 1
    #如果已经存在就不需要再上传了
    if not exist:
        # 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
        bucket.get_object_to_file(object_name, url);
        # 用图片格式转换的方式下载
        # process = "image/format,bmp"
        # bucket.get_object_to_file(object_name, url, process=process)
        # 转换为svg
        os.system('potrace.exe '+ url +' -s --flat')
        # print(displaySvgFileName)
        #上传 OSS
        sult = bucket_svg.put_object_from_file(displaySvgFileName,svgFileName)
        if sult.status == 200:
            try:
                os.remove(url)
                os.remove(svgFileName)
                count+=1
            except:
                count+=1
            finally:
                print(count)

        #删除本地的jpg和svg文件
        
        
        # import cv2 as cv2
        # print("绘制完成,请检查")
    else:
        print (num)

if __name__ == '__main__':

    # print("start \n");
    auth = oss2.Auth(accesskey_id,accesskey_secret)
    # Endpoint以杭州为例,其它Region请按实际情况填写。
    bucket = oss2.Bucket(auth,endpoint , bucket_name);
    bucket_svg = oss2.Bucket(auth,endpoint , bucket_name_svg);
    #单个文件夹下载
    #prefix_all_list(bucket, "newDown");
    root_directory_list(bucket,bucket_svg);

    # print("end \n");

作者:spike

分类: Python

创作时间:2024-02-06

更新时间:2024-02-14

联系方式放在中括号之中例如[[email protected]],回复评论在开头加上标号例如:#1
Copyright © Your Website 2024
介绍 赞助 Github Rss Sitemap 免责声明 联系