218 lines
5.5 KiB
TypeScript
218 lines
5.5 KiB
TypeScript
export default {
|
|
id : 1,
|
|
testUrl:'http://192.168.1.5:10086',
|
|
zIndex:2,
|
|
setColor:(rgba:any,url:string,obj:any) =>{
|
|
return new Promise(resolve =>{
|
|
var min = obj?.min == undefined ? 5 : obj.min;
|
|
var max = obj?.max == undefined ? 5 : obj.max;
|
|
var img = new Image();
|
|
img.src = url;
|
|
let arr:any = []
|
|
img.onload = () => {
|
|
const width = img.width;
|
|
const height = img.height;
|
|
const canvas = document.createElement("canvas");
|
|
canvas.width = width
|
|
canvas.height = height
|
|
var ctx:any = canvas.getContext("2d");
|
|
ctx.drawImage(img,0,0)
|
|
var data = ctx.getImageData(0,0,width,height)
|
|
var ratio = []
|
|
for (let index = 0; index < rgba.length; index++) {
|
|
var num = 0;
|
|
for (let i = 0; i < data.data.length; i+=4) {
|
|
var r = data.data[i];
|
|
var g = data.data[i+1];
|
|
var b = data.data[i+2];
|
|
var a = data.data[i+3];
|
|
if(r - min < rgba[index][0]
|
|
&& r + max > rgba[index][0]
|
|
&& g - min < rgba[index][1]
|
|
&& g + max > rgba[index][1]
|
|
&& b - min < rgba[index][2]
|
|
&& b + max > rgba[index][2]
|
|
){
|
|
num++
|
|
}
|
|
}
|
|
let rgb = {
|
|
rgb:rgba[index],
|
|
ratio:parseInt(String((num/ (width * height) * 100).toFixed(6)))
|
|
}
|
|
ratio.push(rgb)
|
|
// console.log(ratio);
|
|
img.remove()
|
|
// console.log((num/ (width * height) * 100).toFixed(2));
|
|
}
|
|
|
|
|
|
// for (let i = 0; i < data.data.length; i+=4) {
|
|
// var r = data.data[i];
|
|
// var g = data.data[i+1];
|
|
// var b = data.data[i+2];
|
|
// var a = data.data[i+3];
|
|
// arr.push([r,g,b,a])
|
|
// }
|
|
|
|
|
|
// interface Point {
|
|
// x: number;
|
|
// y: number;
|
|
// z: number;
|
|
// }
|
|
|
|
// interface Centroid extends Point {
|
|
// points: Point[];
|
|
// }
|
|
|
|
// // 计算两个点之间的欧氏距离
|
|
// function euclideanDistance(a: Point, b: Point): number {
|
|
// const dx = a.x - b.x;
|
|
// const dy = a.y - b.y;
|
|
// const dz = a.z - b.z;
|
|
// return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
// }
|
|
|
|
// // 使用 K-means 算法获取主要的 RGB 值
|
|
// function getMainRGBValues(rgbData: number[][], k: number): number[][] {
|
|
// const points: Point[] = rgbData.map(rgb => ({
|
|
// x: rgb[0],
|
|
// y: rgb[1],
|
|
// z: rgb[2]
|
|
// }));
|
|
|
|
// // 随机选择初始聚类中心
|
|
// const centroids: Centroid[] = [];
|
|
// for (let i = 0; i < k; i++) {
|
|
// const randomPoint = points[Math.floor(Math.random() * points.length)];
|
|
// centroids.push({ ...randomPoint, points: [] });
|
|
// }
|
|
|
|
// let converged = false;
|
|
|
|
// while (!converged) {
|
|
// // 将每个点分配到最近的聚类中心
|
|
// points.forEach(point => {
|
|
// let minDistance = Infinity;
|
|
// let closestCentroid: Centroid | undefined;
|
|
|
|
// centroids.forEach(centroid => {
|
|
// const distance = euclideanDistance(point, centroid);
|
|
// if (distance < minDistance) {
|
|
// minDistance = distance;
|
|
// closestCentroid = centroid;
|
|
// }
|
|
// });
|
|
|
|
// if (closestCentroid) {
|
|
// closestCentroid.points.push(point);
|
|
// }
|
|
// });
|
|
|
|
// // 更新聚类中心的位置
|
|
// const newCentroids: Centroid[] = [];
|
|
// centroids.forEach(centroid => {
|
|
// const { points } = centroid;
|
|
|
|
// if (points.length > 0) {
|
|
// const sumX = points.reduce((acc, point) => acc + point.x, 0);
|
|
// const sumY = points.reduce((acc, point) => acc + point.y, 0);
|
|
// const sumZ = points.reduce((acc, point) => acc + point.z, 0);
|
|
|
|
// const newX = sumX / points.length;
|
|
// const newY = sumY / points.length;
|
|
// const newZ = sumZ / points.length;
|
|
|
|
// newCentroids.push({ x: newX, y: newY, z: newZ, points: [] });
|
|
// } else {
|
|
// newCentroids.push(centroid);
|
|
// }
|
|
// });
|
|
|
|
// // 检查聚类中心是否发生变化
|
|
// converged = JSON.stringify(centroids) === JSON.stringify(newCentroids);
|
|
// centroids.splice(0, centroids.length, ...newCentroids);
|
|
// }
|
|
|
|
|
|
// // 找到每个聚类的平均颜色值
|
|
// const mainRGBValues = centroids.map(centroid => [
|
|
// Math.round(centroid.x),
|
|
// Math.round(centroid.y),
|
|
// Math.round(centroid.z)
|
|
// ]);
|
|
|
|
// return mainRGBValues;
|
|
// }
|
|
|
|
// // 示例使用
|
|
// const rgbData: number[][] = [
|
|
// [255, 0, 0], // 红色
|
|
// [0, 255, 0], // 绿色
|
|
// [0, 0, 255], // 蓝色
|
|
// // 更多 RGB 数据...
|
|
// ];
|
|
|
|
// const k = 1; // 假设我们想要找到三个主要的 RGB 值
|
|
// const mainRGBValues = getMainRGBValues(rgbData, k);
|
|
// console.log(mainRGBValues); // 输出主要的 RGB 值
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//获取颜色做多的值
|
|
// function findMostFrequent(arr:any) {
|
|
// let map:any = {};
|
|
// let maxCount = 0;
|
|
// let mostFrequent;
|
|
|
|
// for (let item of arr) {
|
|
// if (map[item] === undefined) {
|
|
// map[item] = 1;
|
|
// } else {
|
|
// map[item]++;
|
|
// }
|
|
// if (map[item] > maxCount) {
|
|
// maxCount = map[item];
|
|
// mostFrequent = item;
|
|
// }
|
|
// }
|
|
|
|
// return mostFrequent;
|
|
// }
|
|
// console.log(arr);
|
|
|
|
// console.log(findMostFrequent(arr));
|
|
|
|
resolve({
|
|
width,
|
|
height,
|
|
ratio:ratio,
|
|
})
|
|
}
|
|
})
|
|
},
|
|
// magnifying(normalEl,binEl,mouseWH:any){
|
|
// let mouseW = mouseWH.width?mouseWH.width:10+'rem'
|
|
// let mouseH = mouseWH.height?mouseWH.height:10+'rem'
|
|
// normalEl.offsetWidth
|
|
// }
|
|
} |