概述
Samila是一个用Python编写的生成艺术生成器,它允许你基于数千个点创建图像。每个点的位置都由一个具有随机参数的公式计算得出。由于随机数的存在,每幅图像看起来都不同。
分支 | master | dev |
CI |
安装
PyPI
- 查看Python打包用户指南
- 运行
pip install samila==1.2
源代码
Conda
- 查看 Conda包管理
conda install -c sepandhaghighi samila
使用
魔法
>>> import matplotlib.pyplot as plt
>>> from samila import GenerativeImage
>>> g = GenerativeImage()
>>> g.generate()
>>> g.plot()
>>> plt.show()
- 你可以通过
GenerativeImage
中的func_seed
参数更改函数生成种子
基础
>>> import random
>>> import math
>>> def f1(x, y):
result = random.uniform(-1,1) * x**2 - math.sin(y**2) + abs(y-x)
return result
>>> def f2(x, y):
result = random.uniform(-1,1) * y**3 - math.cos(x**2) + 2*x
return result
>>> g = GenerativeImage(f1, f2)
>>> g.generate()
>>> g.plot()
>>> g.seed
188781
>>> plt.show()
投影
>>> from samila import Projection
>>> g = GenerativeImage(f1, f2)
>>> g.generate()
>>> g.plot(projection=Projection.POLAR)
>>> g.seed
829730
>>> plt.show()
- 支持的投影:
RECTILINEAR
,POLAR
,AITOFF
,HAMMER
,LAMBERT
,MOLLWEIDE
和RANDOM
- 默认投影为
RECTILINEAR
标记
>>> from samila import Marker
>>> g = GenerativeImage(f1, f2)
>>> g.generate()
>>> g.plot(marker=Marker.CIRCLE, spot_size=10)
>>> g.seed
448742
>>> plt.show()
- 支持的标记:
POINT
、PIXEL
、CIRCLE
、TRIANGLE_DOWN
、TRIANGLE_UP
、TRIANGLE_LEFT
、TRIANGLE_RIGHT
、TRI_DOWN
、TRI_UP
、TRI_LEFT
、TRI_RIGHT
、OCTAGON
、SQUARE
、PENTAGON
、PLUS
、PLUS_FILLED
、STAR
、HEXAGON_VERTICAL
、HEXAGON_HORIZONTAL
、X
、X_FILLED
、DIAMOND
、DIAMON_THIN
、VLINE
、HLINE
和RANDOM
- 默认标记为
POINT
旋转
你甚至可以使用rotation
参数旋转你的艺术作品。输入你想要的图像旋转角度,你就能得到它。
>>> g = GenerativeImage(f1, f2)
>>> g.generate()
>>> g.plot(rotation=45)
- 默认旋转角度为0
范围
>>> g = GenerativeImage(f1, f2)
>>> g.generate(start=-2*math.pi, step=0.01, stop=0)
>>> g.plot()
>>> g.seed
234752
>>> plt.show()
颜色
>>> g = GenerativeImage(f1, f2)
>>> g.generate()
>>> g.plot(color="yellow", bgcolor="black", projection=Projection.POLAR)
>>> g.seed
1018273
>>> plt.show()
-
可用的颜色在
VALID_COLORS
列表中 -
color
和bgcolor
参数支持的格式:- 颜色名称(例如:
color="yellow"
) - RGB/RGBA(例如:
color=(0.1,0.1,0.1)
,color=(0.1,0.1,0.1,0.1)
) - 十六进制(例如:
color="#eeefff"
) - 随机(例如:
color="random"
) - 补色(例如:
color="complement", bgcolor="blue"
) - 透明(例如:
bgcolor="transparent"
) - 列表(例如:
color=["black", "#fffeef",...]
)
- 颜色名称(例如:
⚠️ 透明模式仅适用于背景
⚠️ 列表模式仅适用于颜色
⚠️ 在列表模式下,此列表的长度必须等于data1和data2的长度
点颜色
你可以制作自定义颜色映射并在Samila中使用它
>>> colorarray = [
... [0.7, 0.2, 0.2, 1],
... [0.6, 0.3, 0.2, 1],
... "black",
... [0.4, 0.4, 0.3, 1],
... [0.3, 0.4, 0.4, 1],
... "#ff2561"]
>>> g.generate()
>>> g.seed
454893
>>> g.plot(cmap=colorarray, color=g.data2, projection=Projection.POLAR)
>>> plt.show()
重新生成
>>> g = GenerativeImage(f1, f2)
>>> g.generate(seed=1018273)
>>> g.plot(projection=Projection.POLAR)
>>> plt.show()
NFT.storage
直接将生成的图像上传到NFT.storage
>>> g.nft_storage(api_key="YOUR_API_KEY", timeout=5000)
{'status': True, 'message': 'FILE_LINK'}
你也可以将配置/数据上传到NFT.storage,如下所示:
>>> g.nft_storage(api_key="API_KEY", upload_config=True)
{'status': {'image': True, 'config':True}, 'message': {'image':'IMAGE_FILE_LINK', 'config':'CONFIG_FILE_LINK'}
或
>>> g.nft_storage(api_key="API_KEY", upload_data=True)
{'status': {'image': True, 'data':True}, 'message': {'image':'IMAGE_FILE_LINK', 'data':'DATA_FILE_LINK'}
你可以选择特定的IPFS网关:
>>> from samila import Gateway
>>> g.nft_storage(api_key="API_KEY", upload_data=True, gateway=Gateway.DWEB)
{'status': {'image': True, 'data':True}, 'message': {'image':'IMAGE_FILE_LINK', 'data':'DATA_FILE_LINK'}
- 默认超时时间为3000秒
- 默认网关为IPFS_IO
保存图像
保存生成的图像
>>> g.save_image(file_adr="test.png")
{'status': True, 'message': 'FILE_PATH'}
以更高分辨率保存生成的图像
>>> g.save_image(file_adr="test.png", depth=5)
{'status': True, 'message': 'FILE_PATH'}
保存数据
保存生成的图像数据
>>> g.save_data(file_adr="data.json")
{'status': True, 'message': 'FILE_PATH'}
这样你之后可以通过以下方式将其加载到GenerativeImage
实例中
>>> g = GenerativeImage(data=open('data.json', 'r'))
数据结构:
{
"plot": {
"projection": "polar",
"bgcolor": "black",
"color": "snow",
"spot_size": 0.01
},
"matplotlib_version": "3.0.3",
"data1": [
0.3886741692042526,
22.57390286376703,
-0.1646310981668766,
66.23632344600155
],
"data2": [
-0.14588750183600108,
20.197945942677833,
0.5485453260942901,
-589.3284610518896
]
}
保存配置
保存生成的图像配置。它包含函数的字符串格式,也是人类可读的。
>>> g.save_config(file_adr="config.json")
{'status': True, 'message': 'FILE_PATH'}
这样你之后可以通过以下方式将其加载到GenerativeImage
实例中
>>> g = GenerativeImage(config=open('config.json', 'r'))
配置结构:
{
"matplotlib_version": "3.0.3",
"generate": {
"seed": 379184,
"stop": 3.141592653589793,
"step": 0.01,
"start": -3.141592653589793
},
"f2": "random.uniform(-1,1)*math.cos(x*(y**3))+random.uniform(-1,1)*math.ceil(y-x)",
"f1": "random.uniform(-1,1)*math.ceil(y)-random.uniform(-1,1)*y**2+random.uniform(-1,1)*abs(y-x)",
"plot": {
"color": "snow",
"bgcolor": "black",
"projection": "polar",
"spot_size": 0.01
}
}
数学细节
Samila 实质上是将笛卡尔坐标系中的方形空间转换为任意坐标系(如极坐标系)的变换。
示例
我们在第一个空间(左侧方形)中有一组点,可以定义如下:
以下函数用于转换:
>>> def f1(x, y):
result = random.uniform(-1,1) * x**2 - math.sin(y**2) + abs(y-x)
return result
>>> def f2(x, y):
result = random.uniform(-1,1) * y**3 - math.cos(x**2) + 2*x
return result
这里我们使用 Projection.POLAR
,所以后面的空间将是极坐标空间,我们有:
>>> g = GenerativeImage(f1, f2)
>>> g.generate(seed=10)
>>> g.plot(projection=Projection.POLAR)
在浏览器中试用 Samila!
Samila 可以通过 Binder 或 Colab 服务在线使用交互式 Jupyter Notebooks!现在就来试试吧!:
- 查看
examples
文件夹
问题与错误报告
只需填写一个 issue 并描述问题。我们会尽快检查!或发送电子邮件至 info@samila.site。
- 请完整填写 issue 模板
你也可以加入我们的 Discord 服务器
社交媒体
参考文献
1- Schönlieb, Carola-Bibiane, and Franz Schubert. "Random simulations for generative art construction–some examples." Journal of Mathematics and the Arts 7.1 (2013): 29-39.
2- 使用 R 创建生成艺术
3- NFT.storage : 免费去中心化存储和 NFT 带宽
致谢
本项目由 Protocol Labs 设立的 Next Step Microgrant 计划资助。
表示支持
为这个仓库点星
如果这个项目对你有帮助,请给一个 ⭐️!
为我们的项目捐款
如果你喜欢我们的项目,我们希望你能支持我们。我们的项目现在不是也永远不会以盈利为目的。我们需要这笔钱只是为了继续我们正在做的事情 ;-) 。