用Python+pywin32模块实现绘制原神女性角色珊瑚宫图片,画画第一弹

Posted Cooci

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Python+pywin32模块实现绘制原神女性角色珊瑚宫图片,画画第一弹相关的知识,希望对你有一定的参考价值。

前言

Python+pywin32模块实现绘制原神女性角色珊瑚宫图片

开发工具

Python版本:3.6.4

相关模块:

cv2模块;

numpy模块;

pywin32模块;

bs4模块;

以及一些Python自带的模块。

其他:

potrace

效果展示

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理简介

一. 实现步骤

首先读入原图:

    img_path = \'./test.jpg\'
    img_bit = cv2.imread(img_path)
    # 画图时的颜色数
    K = 32
    # 避免照片过大
    if img_bit.shape[0] > GetSystemMetrics(1):
        width = int(img_bit.shape[1] * ((GetSystemMetrics(1) - 50) / img_bit.shape[0]))
        height = GetSystemMetrics(1) - 50
        img_bit = cv2.resize(img_bit, (width, height))

其次将原图像的颜色数量通过K均值聚类降低到指定的数量,K值越大,运行速度越慢,但效果越佳:

data = img_bit.reshape((-1, 3))
    data = np.float32(data)
    # 聚类迭代停止的模式(停止的条件, 迭代最大次数, 精度)
    criteria = (cv2.TERM_CRITERIA_EPS, 10, 1.0)
    # 数据, 分类数, 预设的分类标签, 迭代停止的模式, 重复试验kmeans算法次数, 初始类中心的选择方式
    compactness, labels, centers = cv2.kmeans(data, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    centers = np.uint8(centers)
    data_compress = centers[labels.flatten()]
    img_new = data_compress.reshape(img_bit.shape)

每次取出聚类结果中的一种颜色并利用potrace将其转为SVG格式的图形,再解析该格式并用Python自带的turtle库画出来:

    for center in centers:
        count += 1
        print(\'[INFO]: Drawing %dth color...\' % count)
        part = cv2.inRange(img_new, center, center)
        part = cv2.bitwise_not(part)
        cv2.imwrite(\'.tmp.bmp\', part)
        os.system(\'potrace.exe .tmp.bmp -s --flat\')
        if count == 1:
            drawSVG(\'.tmp.svg\', \'#%02x%02x%02x\' % (center[2], center[1], center[0]), True)
        else:
            drawSVG(\'.tmp.svg\', \'#%02x%02x%02x\' % (center[2], center[1], center[0]), False)

二. SVG格式

SVG,即可缩放矢量图形,是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。SVG主要支持以下几种显示对象:

1.矢量显示对象,基本矢量显示对象包括矩形、圆、椭圆、多边形、直线、任意曲线等;

2.嵌入式外部图像,包括PNG、JPEG、SVG等;

3.文字对象。

更多关于SVG的技术细节请参考:

http://www.w3school.com.cn/svg/svg_intro.asp

三. Turtle库

这里推荐一份turtle库的文档:

https://www.rddoc.com/doc/Python/3.6.0/zh/library/turtle/

四. 贝塞尔曲线

画图时用到了贝塞尔曲线,这里简单介绍一下。

贝塞尔曲线的数学基础是伯恩斯坦多项式,其得名于法国工程师Pierre Bézier。

贝塞尔曲线控制简便却具有极强的描述能力,因此在工业设计领域应用广泛;同时,贝塞尔曲线在矢量图形学领域也占有重要的地位。今天我们最常见的一些矢量绘图软件(例如Flash,CorelDraw,PS等等)均提供了绘制贝塞尔曲线的功能。

线性公式:

给定点P0、P1,线性贝塞尔曲线是一条两点之间的直线,确定方式如下:

其实就是线性插值。

二次方公式:
给定点P0、P1和P2,二阶贝塞尔曲线的路径确定方式如下:

n次方公式:

给定点P0到Pn,n阶贝塞尔曲线的路径确定方式如下:

贝塞尔曲线的绘制方式(以二阶为例):

假设平面内不共线的三个点如下图所示:

在AB上选一点D,BC上选一点E,使得:
AD:AB=BE:BC。
连接DE:

在DE上选一点F,使得:
AD:AB=BE:BC=DF:DE

保证AD,AB,BE,BC,DF,DE之间的比例关系不变,让D点从A点运动到B点,则所有的点F构成的曲线即为二阶贝塞尔曲线:

n阶贝塞尔曲线的绘制方式类似,例如三阶和四阶:

文章到这里就结束了,感谢你的观看,下篇文章分享Excel中生成小姐姐

为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。

干货主要有:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

All done~详见个人主页简介或私信获取完整源代码。。

以上是关于用Python+pywin32模块实现绘制原神女性角色珊瑚宫图片,画画第一弹的主要内容,如果未能解决你的问题,请参考以下文章

Windows平台Python编程必会模块之pywin32

Python:通过pywin32模块批量将rtf或docx另存为doc格式

python win32gui模块下载

pywin32 - Python 在Windows COM 编程模块

pywin32模块按钮

Pywinauto常用02--pywin32(Python调用win api)