python+jQuery 实现颜色比重分析
1.使用到的python库
time
webbrowser
cv2
collections
2.创作思路:利用cv2库中的方法逐行扫描图片的每一个像素点,获取每一个像素点的 rgb值 并进行信息的处理,串联成一个巨大的array,接着利用collections中的Counter对象,对收集到的图片信息进行统计排序,最终将会产生一个经过排序的字典,由于未处理的数据将会返回所有的结果以及对应的出现次数,所以对此增加了一个处理
Counter©.most_common(5) 例如这样将会返回排位 前5 的数
接着将信息写入一个本地的results.txt文件
之后就是jquery的发生,通过对 txt文件的处理,对字符串进行处理巴拉巴拉,并进行渲染,即可获得所需要的信息;
下面展示一些 内联代码片
。
import time
import webbrowser
from cv2 import cv2
from collections import Counter
file_handle1=open('results.txt', mode='w') #打开txt文件
print('作者:洛杉矶柠檬人')
print('分析程序开始!!!!!!!!!!!!!!!!')
print('--------------------------------------')
print("请输入图片路径,例如 test01.jpg 或者 C:\\Users\\Shuinane\\Pictures\\test01.jpg")
x = input("请输入图片路径:")
pic_path = x #图片路径
time_start=time.time() #计时开始
img = cv2.imread(pic_path) #读取图片
b, g, r = cv2.split(img) # 默认BGR转换为RGB
img2 = cv2.merge([r, g, b])
print('图片高度:'+str(img2.shape[0])+'px') #打印高度
print('图片宽度:'+str(img2.shape[1])+'px') #打印宽度
print('正在分析中...')
#读取图片rgb信息代码,生成一个每个点的rgb列表
c = []
for x in range(img2.shape[0]):
for y in range(img2.shape[1]):
c.append(str(img2[x, y][0])+','+str(img2[x, y][1])+','+str(img2[x, y][2]))
a = len(c)
print('图片大小:'+str(a)+'px') #通过计算c列表的长度得到图片的大小 即 列表的长度 == 像素点的个数 == 图片的大小
print('色彩种类:'+str(len(list(Counter(c))))) #通过计算counter(c)列表的长度得到图片的色彩数量 即 列表的长度 == 图片的色彩数量
print("请输入展示色彩数量,将自动为您降次排列。 ")
y=input("请输入展示色彩数量:")
file_handle1.write(str(Counter(c).most_common(int(y)))) #修改数字 ,你即可获取对应色彩数量(递减排列),例如你输入 10 则返回排列前 10 的颜色信息 ,输入 a 则 返回所有出现过的颜色
file_handle1.write('!'+str(a)+'!')
time_end = time.time()
print('分析耗时:', time_end-time_start, 's')
print('分析程序结束!!!!!!!!!!!!!!!!!!')
print('开始浏览器端渲染,数据信息也可在 results.txt 内查看')
print('--------------------------------------')
file_handle1.close()
webbrowser.open("run.html")
print('回车键结束程序')
end=input('')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>色彩比重图</title>
<script src="jquery.min.js"></script>
<style>
* {
margin: 0;
padding: 0;
box-sizing: content-box;
}
div {
display: flex;
flex-wrap: wrap;
}
span {
position: relative;
border: 1px dotted white;
height: 120px;
width: 120px;
background-color: #bfbfbf;
overflow: hidden;
}
a:nth-child(1) {
text-align: center;
line-height: 35px;
position: absolute;
top: 0;
width: 120px;
height: 35px;
font-weight: bolder;
}
a:nth-child(2) {
text-align: center;
line-height: 35px;
position: absolute;
bottom: 0;
width: 120px;
height: 35px;
display: none;
}
</style>
</head>
<body>
<input type="file" onchange="upload(this)"/>
<div>
</div>
</body>
<script>
function upload(input) { //支持chrome IE10
$('input').hide();
alert('频率 从左至右 由上到下 依次递减,数据量大的话,请耐心等待色块的生成!')
if (window.FileReader) {
var file = input.files[0];
filename = file.name.split(".")[0];
var reader = new FileReader();
reader.onload = function() {
var alldots = this.result.split('!')
console.log(alldots[1])
var matchReg = /'.*?\'/gi; //所有的像素点
for (let i=0; i< this.result.substring(0, this.result.length - 1).slice(1).split('),').length; i++) {
$("div").append(
'<span><a>1</a><a>2</a></span>'
);
}
$('span').mouseover(function () {
$($(this)[0].children[1]).show();
$($(this)[0].children[1]).html($(this).attr('bkc'));
});
$('span').mouseleave(function () {
$($(this)[0].children[1]).hide();
});
for (let i=0; i< this.result.substring(0, this.result.length - 1).slice(1).split('),').length; i++) {
$($("div")[0].children[i]).css('background-color', 'rgb('+this.result.substring(0, this.result.length - 1).slice(1).split('),')[i].match(matchReg)[0].substr(0, this.result.substring(0, this.result.length - 1).slice(1).split('),')[i].match(matchReg)[0].length-1).substring(1)+')').attr('bkc', this.result.substring(0, this.result.length - 1).slice(1).split('),')[i].match(matchReg)[0].substr(0, this.result.substring(0, this.result.length - 1).slice(1).split('),')[i].match(matchReg)[0].length-1).substring(1));
m = this.result.split('!')[0].substr(1).substring(0,this.result.split('!')[0].substr(1).length-1).split(")")[i].split("',")[1]
console.log(m)
console.dir($('div')[0].children[i].children[0]);
$($('div')[0].children[i].children[0]).html(Math.round(Number(m)/Number(alldots[1]) * 10000)/100.00+'%');
if(Math.round(Number(m)/Number(alldots[1]) * 10000)/100.00+'%' == '0%'){
$($('div')[0].children[i].children[0]).html('几乎为 0%');
}
}
}
reader.readAsText(file);
}
// //支持IE 7 8 9 10
// else if (typeof window.ActiveXObject != 'undefined'){
// var xmlDoc;
// xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
// xmlDoc.async = false;
// xmlDoc.load(input.value);
// alert(xmlDoc.xml);
// }
// //支持FF
// else if (document.implementation && document.implementation.createDocument) {
// var xmlDoc;
// xmlDoc = document.implementation.createDocument("", "", null);
// xmlDoc.async = false;
// xmlDoc.load(input.value);
// alert(xmlDoc.xml);
// } else {
// alert('error');
// }
}
</script>
</html>
链接:
https://pan.baidu.com/s/1QARO1zxsptNjkJwNK336dg
提取码:1119