尝试做出超级玛丽风格的画..失败


昨晚回去路上看了知乎日报上小时候那种插卡玩的游戏机,原来是这么呈现出来的,才知道原来FC游戏上只用了64种颜色,而且还有几个是重复的.
之前我试过做像素化(当时我觉得那种风格叫做像素化),方法很简单,把一张图分成相邻的小方块,只从这个方块里采样一个点,用这个点的RGB作为这个小方块的RGB,这样做出来其实有那么些意思.

看了那个文章之后才知道我用的色彩太多了,应该先减少颜色.一查才知道原来MATLAB的colormap就是color palette,MATLAB把使用color palette的图片叫做indexed image,就是每个像素位置存了一个索引,用这个索引在color map里找出对应的RGB.

第一步是减少颜色. MATLAB可以把普通的RGB图片转换成indexed image,并且可以选择生成的color map的大小,也就是使用颜色的个数.我把RGB转成了有55种颜色的indexed image.

1
2
I = imread('pixel1.jpg');
[IND,map] = rgb2ind(I,55);

转完之后是这个样子.

NES的color map是这样

查到了NES的color map对应的RGB,直接放进去.

1
2
3
4
5
6
7
8
9
nes_cmap = [
124,124,124;
0,0,252;
0,0,188;
68,40,188;
148,0,132;
168,0,32;
......................................
]

然后我的想法是换color map,就是把这张图片的55个颜色换成NES的55个颜色.具体怎么换我不知道,直觉上虽然现在的到的这两个color map不一样,但至少相似的颜色对应的向量距离会比较小吧?那就对现在图片的color map中的每一个颜色,在NES color map中找一个距离最短的换上.然后事实证明我太天真了.这样换完color map是这样.

天怎么都红了呢…..哎接着做看最后效果吧.

接着是像素化.以前是用小方块产生出像素块的感觉,在MATLAB里面这么做有点不知道怎么办.MATLAB里面有个imresize,可以缩放图片,我想如果先缩小图片,再放大到原来的尺寸,这个函数放大时应该是会选择附近点的RGB作为填充,这样就能像素化了吧.试了试果然可行.

1
2
3
% 先缩小5倍再放大5倍
[Y, newmap] = imresize(IND, newmap, 0.2);
[Z, newnewmap] = imresize(Y, newmap, 5,'nearest');

最终结果是这样,虽然失真的不成样子,但我觉得还挺好看的…


有种玩着玩着电视机坏掉的感觉..

总之是失败了..我在google play上搜到了一个这样的app,8Bit Photo Lab,效果很棒..就是不知道是怎么做的.求教程..