目标
实现和ppt上类似的效果,对电影海报进行颜色统计并展现出来
ppt上的效果:
1.0版本
1.0版本首先绘制每幅电影海报的色彩图,然后再扩充到整个月份、年度等
我们获取到的海报都是彩色图像,所以总共的色彩会有256X256X256个,这个数量是庞大的,所以我们在R、G、B三色中分别抽取4个,最后会有4X4X4=64个色彩,这个是比较适中的
我们对0-255分为4组,每组取其平均数,即:
0-63–>32
64-127–>96
128-191–>160
192-255–>224
比如我们有个色彩是[35,230,180],分别对应R、G、B
那这个色彩对应我们选取的64个色彩的第几个呢?
我们作出规定:先B、后G,最后R
64色彩中的第n个,n=(B/64)+(G/64)4+(R/64)16
所以我们这个色彩就对应[32,224,160],是64色彩中的第14个(从0开始)
64色彩按顺序依次如下:
0[32,32,32] 1[32,32,96] 2[32,32,160] 3[32,32,224]
4[32,96,32] 5[32,96,96] 6[32,96,160] 7[32,96,224]
8[32,160,32] 9[32,160,96] 10[32,160,160] 11[32,160,224]
12[32,224,32] 13[32,224,96] 14[32,224,160] 15[32,224,224]
16[96,32,32]……依次类推
然后将图片中的所有色彩分配到这64种颜色中,为了让最后的结果更加明显,64的颜色中的每种颜色的像素数扩充10倍,即达到640
最后将这64种颜色按序填充至640X10的jpg图像中
代码
因为之前在学习图像加密时,使用的java,所以依然使用java
1 | package graphic; |
注意事项
注意BufferedImage outImage=new BufferedImage(640,10,BufferedImage.TYPE_3BYTE_BGR);
设置输出图像的类型要设置成TYPE_3BYTE_BGR,不要使用image.getType,因为使用了image.getType后,有些生成jpg图像不行,生成png都可以,这可能和图像自身有关,所以统一使用BufferedImage.TYPE_3BYTE_BGR,表示一个具有8位RGB颜色分量的图像,具有三字节存储的R、G、B三种颜色
实现效果
选《一条狗的回家路》这部电影的海报,海报如下:
生成的颜色分布图如下所示:
可以发现效果还是不错的
2.0版本
实现了单个电影的后,实现按月统计的2019全年的色彩图,原理和单条的是相同的,只不过将单条的像素量调整为一个月里所有海报的
代码
1 | package graphic; |
效果
图像大小为640X120,从上到小为2019年1-12月电影海报颜色分布,每一个月高度为10,宽度为640