动物森友会 像素画制作

动森里面的专业设计让我有了个大胆的想法:既然能作画,那就可以像minecraft一样能整一波像素画了。房贷也不还了,连岛民都不打招呼了,专门花了一整晚实现了这个想法。

效果如下:

想了一想,自己还是走了点歪路。

如上图所示,“我的设计”里有5x10个设计样纸(初始情况下前10个是系统自带的,剩下40个是空白的,当然无论是自带的还是空白的,都可以自己改就是了),每个设计样纸有32x32个像素点。

一开始我的想法是:先在一格设计样纸上画,画完铺地上,然后再删除,画第二幅。然而,很快就被打脸了。放在地上的那个图案依然会这受设计样纸影响……也就是说,在样纸上做出的改动,也会同步到地上的图案。这样,图片的大小必须缩放到50个样纸能完成的范围之内。好吧,也不是不行。

接下来就是颜色问题,这个很简单,如上图所示,毫无疑问就是一个HSB(同HSV)色域调色盘了,用过SAI和PS的人应该很熟悉了。只不过这个是离散的色域空间,并且调色盘的数量限制了不超过15个,仅此而已。

先对离散色域空间下手,首先检查色调(Hue):


这是左右两边的取值,差不多就是将360°的环均分成30份,每个色调间隔12°左右。

接着就是鲜艳度:


最左边的是0%,然而最右边只有97%,意味着不是全色域空间……

最后是亮度:


最小值是5%,最大值是90%???

行吧,至少对图片做一个数值截断,接着一个线性变换和离散化舍入就可以完成了。

该动手了。

首先,来一张图片!

画师:光崎,原作品pixiv id:57808612

然后等比缩放到240x142,这样刚好40格设计图纸就能够完成,马赛克画长这样:

然后将它从RGB色域转为HSV色域(数值默认都是用byte表示,即最小值为0,最大值为255)。根据上面的色域范围,动森调色盘内的色调、鲜艳度和亮度的取值(从0计数)可以根据图片原来的色调$h$、鲜艳度$s$和亮度$v$的值进行如下的离散线性变换得到:

$\%$是取余;$\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个像素分隔一块,也省得看的眼瞎。

花了十来分钟在动森上实验了一下,效果的确还行:

到此结束,大功告成,剩下的有空再整了。(奇怪的知识并没有增加)