Pixelhouse一个精美的极简主义的python绘图库
1 说明:
=====
1.1 Pixelhouse:一个极简主义的绘图库,用于在python中制作精美的动画。
1.2 可以移动任何可以绘制的东西。配有漂亮的渐变,类似instagram的滤镜和弹性变换。
1.3 官网英文:
A minimalist drawing library for making beautiful animations in python.
Anything that can be drawn can be moved.
Comes with beautiful gradients, instagram-like filters, and elastic transforms.
2 准备:
=====
2.1 环境:
华为笔记本电脑、深度deepin-linux操作系统、python3.8和微软vscode编辑器。
2.2 传送门:https://github.com/thoppe/pixelhouse
2.3 安装:pip install pixelhouse #本机安装 #sudo pip3.8 install pixelhouse #推荐安装 #sudo pip3.8 install -i https://mirrors.aliyun.com/pypi/simple pixelhouse
===以下代码为注释讲解版===
3 Hello world:
==========
3.1 代码:import pixelhouse as ph #C = ph.Canvas() #采用默认 #默认 #Canvas(width=200, height=200, extent=4.0, bg="black", img=None, name="pixelhouseImage", shift=8) #指定参数值 C = ph.Canvas(800, 800,bg="pink", name="win one") #中文乱码 #在C中加入文本文字 #C+=ph.text("Hello World") #默认设置,不可以显示中文 #自定义:字体(需自行下载中文字体:hwfs=华文仿宋,放在根目录下),字体大小设置 C+=ph.text("Hello World;你好世界",color="green",font="hwfs.ttf",font_size=0.5) #保存 #C.save("/home/xgj/Desktop/Pixelhouse/Helloworld.png") #显示 C.show()
3.2 图:
4 palette(调色板):
===============
4.1 注释版调色板和颜色列表代码:#pixelhouse=像素屋 import pixelhouse as ph pal=ph.palette(5) #print(pal[:]) #[[232, 221, 203, 255], [205, 179, 128, 255], [3, 101, 100, 255], [3, 54, 73, 255], [3, 22, 52, 255]] #pal[2],得到:[3, 101, 100, 255] #草绿色 """ C=ph.Canvas(1000,1000,extent=8.0,bg=pal[3],) C.show()
4.2 注意:复习和总结
#当≥5时,列表仍是5组,但是列表内的颜色值发生改变
#打印每个像素点的颜色RGBA的值(r,g,b,alpha)
#我们常见的RGB图像通常只有R、G、B三个通道
#A通道=alpha通道,是指给图像添加透明度
rgba表示颜色方式为rgba(a,b,c,d)
其中abc用来表示颜色,d用来表示透明度
(r, g, b, a)有4个值,每个都是0到255,RGBA的a(d值)就代表透明度。
5 palette_blocks=调色板块:
====================
5.1 代码:#palette_blocks=调色板块 """ #方法一 import pixelhouse as ph #默认 ph.palette_blocks(range(20)).show() """ """ #方法二,与上面效果相同 import pixelhouse as ph ph_win=ph.palette_blocks(range(20)) ph_win.show() """ import pixelhouse as ph #自定义columns为4 ph_win=ph.palette_blocks(range(20),columns=4) #默认 #palette_numbers, columns=2, show_number=True, width=400 ph_win.show()
5.2 图:
6 图片展示:
=========import pixelhouse as ph C = ph.Canvas(800, 800,bg="pink", name="win one") #C.load("/home/xgj/Desktop/Pixelhouse/20.jpeg") #加载图片,jpeg #C.load("/home/xgj/Desktop/Pixelhouse/blue_woods.jpg") #加载图片,jpg C.load("/home/xgj/Desktop/Pixelhouse/blue_woods.png") #加载图片,png #C.load("/home/xgj/Desktop/Pixelhouse/yytd.gif") #gif格式不行 #保存 #C.save("/home/xgj/Desktop/Pixelhouse/picx.png") #显示 C.show()
===高级绘图===
7 代码:import numpy as np import pixelhouse as ph #定义函数 def logo_animation(logo_text): #作者提示取色法 #pal = ph.palette(3) #我自己打印出来看看什么情况 #print(pal) #[[85, 98, 112, 255], [78, 205, 196, 255], [199, 244, 100, 255], [255, 107, 107, 255], [196, 77, 88, 255]] #我喜欢自定义取色法 pal=["red","blue","green","pink","orange"] A = ph.Animation(fps=24, duration=1.5, width=800, height=800, bg=pal[2]) #颜色渐变从red到blue lg = ph.gradient.linear([pal[0], pal[1]], theta=-np.pi / 4) #画圈 A += ph.circle(color=pal[3]) A += ph.filters.gaussian_blur() A += ph.circle(color=pal[3]) y = ph.motion.easeInOutQuad(0, 1, flip=True) for i in np.arange(-6, 6, 1.0): #gradient=lg,文字有渐变颜色 A += ph.text(logo_text, y=i * y, gradient=lg, font_size=1.0) return A if __name__ == "__main__": logo_text = "pixelhouse" save_name = "/home/xgj/Desktop/Pixelhouse/logo_pixelhouse_animated5.gif" ph.canvas2gif(logo_animation(logo_text), save_name, gifsicle=True)
图:
8 代码:import pixelhouse as ph from pixelhouse import Animation,circle,canvas2gif import pixelhouse.motion as motion def rotating_circles(): A = Animation(width=500, height=500, duration=1.5, fps=20, extent=4) x = motion.easeInOutQuad(-1, 1, flip=True) A(circle(x, 1, r=2.5, color=[0, 250, 150], mode="add")) A(circle(-x, -1, r=2.5, color=[255, 5, 100], mode="add")) return A if __name__ == "__main__": canvas2gif(rotating_circles(), "/home/xgj/Desktop/Pixelhouse/moving_circles6.gif",palettesize=32,gifsicle=True)
图:
9 pacman代码:
#*args:发送一个非键值对的可变数量的参数列表给函数。(顺带复习python的魔法语法)import pixelhouse as ph from pixelhouse import Animation,ellipse, canvas2gif import pixelhouse.motion as motion import numpy as np #保留下面的注释,主要是了解python的魔法语法 #canvas_args = {"width": 500, "height": 500, "extent": 4} #animation_args = {"fps": 20, "duration": 1.5} #animation_args.update(canvas_args) #gif_args = {"palettesize": 32, "gifsicle": True} def pacman(): #args = animation_args.copy() #args["duration"] = 0.5 #A = Animation(**args) A = Animation(width=500, height=500, duration=0.5, fps=20, extent=4) pac_color = (253, 255, 0) dp = np.pi / 4 n = len(A.timepoints) t0 = A.timepoints[: n // 2] t1 = A.timepoints[n // 2 :] x0 = motion.easeOutQuad(0, dp)(t0) x1 = motion.easeInQuad(dp, 0)(t1) z = np.hstack([x0, x1]) #椭圆形 A += ellipse(a=2, b=2, angle_start=z, angle_end=2 * np.pi - z, color=pac_color) return A if __name__ == "__main__": #canvas2gif(pacman(), "/home/xgj/Desktop/Pixelhouse/pacman7.gif", **gif_args) canvas2gif(pacman(), "/home/xgj/Desktop/Pixelhouse/pacman7.gif", palettesize=32,gifsicle=True)
图:
10 checkerboard代码:import pixelhouse as ph from pixelhouse import Canvas, Animation,circle, canvas2gif import pixelhouse.motion as motion #itertools用于高效循环的迭代函数集合 import itertools def checkerboard(): A = Animation(width=500, height=500, duration=1.5, fps=20, extent=4) z = motion.easeInOutQuad(0, 1, True) r = 0.40 c = [150, 250, 0] coord = [-2, 0, 2] #定义参数 args = {"r": r, "color": c, "mode": "add"} for dx, dy in itertools.product(coord, repeat=2): #引用参数,画圈 A += circle(z + dx, z + dy, **args) A += circle(z + dx, -z + dy, **args) A += circle(-z + dx, -z + dy, **args) A += circle(-z + dx, z + dy, **args) A += circle(dx, z + dy, **args) A += circle(z + dx, dy, **args) A += circle(dx, -z + dy, **args) A += circle(-z + dx, dy, **args) return A if __name__ == "__main__": canvas2gif(checkerboard(), "/home/xgj/Desktop/Pixelhouse/checkerboard8.gif", palettesize=32,gifsicle=True)
图:
11 高级欢迎的代码:import pixelhouse as ph from pixelhouse import * from pixelhouse.filters import * from pixelhouse.motion import * from pixelhouse.transform import * import numpy as np def main(): #pal = palette(15) #自带颜色列表 #我喜欢自定义颜色 pal=["black","green","blue","pink","orange"] C = Animation(500, 500, duration=1.5, fps=20, extent=4,bg=pal[0]) y = easeInOutQuad(-2, 2, flip=True) def draw_circles(C): C += circle(-2, y, r=0.40, color=pal[1]) C += circle(-1, -y, r=0.40, color=pal[2]) C += circle(1, y, r=0.40, color=pal[1]) C += circle(2, -y, r=0.40, color=pal[2]) draw_circles(C) C += gaussian_blur(1.0, 1.0) draw_circles(C) with C.layer() as L: theta = easeInOutQuad(0, 2 * np.pi) L += rectangle(-0.5, -0.5, 0.5, 0.5, color=pal[3]) L += rotate(theta) #导入本地根目录下的中文字体:hwfs f_font = "hwfs.ttf" #颜色渐变效果,从2~3(green→blue) g = ph.gradient.linear([pal[2], pal[3]]) C += text("欢迎光临", y=3, font_size=1.0, font=f_font, gradient=g) C += text("pixelhouse", y=-3, font_size=1.0, font=f_font, gradient=g) return C #没有ta,是不能保存为gif #C.show() #没有ta,是不能显示gif if __name__ == "__main__": canvas2gif(main(),"/home/xgj/Desktop/Pixelhouse/pic_gif_start9.gif", palettesize=32,gifsicle=True,)
图:
===自己整理并分享出来===
喜欢的就点赞、评论、转发、关注和收藏。