动森里面的专业设计让我有了个大胆的想法:既然能作画,那就可以像minecraft一样能整一波像素画了。房贷也不还了,连岛民都不打招呼了,专门花了一整晚实现了这个想法。
效果如下:
想了一想,自己还是走了点歪路。
如上图所示,“我的设计”里有5x10
个设计样纸(初始情况下前10个是系统自带的,剩下40个是空白的,当然无论是自带的还是空白的,都可以自己改就是了),每个设计样纸有32x32
个像素点。
一开始我的想法是:先在一格设计样纸上画,画完铺地上,然后再删除,画第二幅。然而,很快就被打脸了。放在地上的那个图案依然会这受设计样纸影响……也就是说,在样纸上做出的改动,也会同步到地上的图案。这样,图片的大小必须缩放到50个样纸能完成的范围之内。好吧,也不是不行。
接下来就是颜色问题,这个很简单,如上图所示,毫无疑问就是一个HSB(同HSV)色域调色盘了,用过SAI和PS的人应该很熟悉了。只不过这个是离散的色域空间,并且调色盘的数量限制了不超过15个,仅此而已。
先对离散色域空间下手,首先检查色调(Hue):
这是左右两边的取值,差不多就是将360°的环均分成30份,每个色调间隔12°左右。
接着就是鲜艳度:
最左边的是0%,然而最右边只有97%,意味着不是全色域空间……
最后是亮度:
最小值是5%,最大值是90%???
行吧,至少对图片做一个数值截断,接着一个线性变换和离散化舍入就可以完成了。
该动手了。
首先,来一张图片!
然后等比缩放到240x142
,这样刚好40格设计图纸就能够完成,马赛克画长这样:
然后将它从RGB色域转为HSV色域(数值默认都是用byte表示,即最小值为0,最大值为255)。根据上面的色域范围,动森调色盘内的色调、鲜艳度和亮度的取值(从0计数)可以根据图片原来的色调$h$、鲜艳度$s$和亮度$v$的值进行如下的离散线性变换得到:
$$f(h)=\operatorname{round}(h/255*30)%30$$
$$g(s)=\operatorname{round}(\operatorname{clip}(s,0,2550.97)/(2550.97)*14)$$
$$h(v)=\operatorname{round}((\operatorname{clip}(v,2550.05,2550.9)-2550.05)/(2550.85)*14)$$
$%$是取余;$\operatorname{round}(x)$是舍入函数,$x<0.5$时取0,否则取1;$\operatorname{clip}(x,a,b)$是截断函数,$x < a$时取$a$,$x > b$时取$b$,否则取$x$。
图片就长这样子了:
好像影响不大,接下来就是切片了,将图片切成若干张32x32
小图,然后把每张切片图片的颜色数量限制在15种以内(因为调色盘就只有15个),这个直接用PIL
包里面的convert('P', palette=Image.ADAPTIVE, colors=15)
就可以完成了。
拼起来就是这样:
切片之后,边缘色差是个问题,不过全局统一调色盘颜色又会缺失大量细节,不好取舍,现就这样吧。
最后生成一个txt记录一下切片的x、y坐标,调色盘的数值,每个格子用哪种色,完事,再每5个像素分隔一块,也省得看的眼瞎。
花了十来分钟在动森上实验了一下,效果的确还行:
到此结束,大功告成,剩下的有空再整了。(奇怪的知识并没有增加)