使用RGBaster获得图片的主题色,从而判断文字颜色深浅

1.首先引入RGBaster.js

;
(function(window, undefined) {

	"use strict";

	// Helper functions.
	var getContext = function(width, height) {
		var canvas = document.createElement("canvas");
		canvas.setAttribute('width', width);
		canvas.setAttribute('height', height);
		return canvas.getContext('2d');
	};

	var getImageData = function(img, loaded) {

		var imgObj = new Image();
		var imgSrc = img.src || img;

		// Can't set cross origin to be anonymous for data url's
		// https://github.com/mrdoob/three.js/issues/1305
		if (imgSrc.substring(0, 5) !== 'data:')
			imgObj.crossOrigin = "Anonymous";

		imgObj.onload = function() {
			var context = getContext(imgObj.width, imgObj.height);
			context.drawImage(imgObj, 0, 0);

			var imageData = context.getImageData(0, 0, imgObj.width, imgObj.height);
			loaded && loaded(imageData.data);
		};

		imgObj.src = imgSrc;

	};

	var makeRGB = function(name) {
		return ['rgb(', name, ')'].join('');
	};

	var mapPalette = function(palette) {
		var arr = [];
		for (var prop in palette) {
			arr.push(frmtPobj(prop, palette[prop]))
		};
		arr.sort(function(a, b) {
			return (b.count - a.count)
		});
		return arr;
	};

	var fitPalette = function(arr, fitSize) {
		if (arr.length > fitSize) {
			return arr.slice(0, fitSize);
		} else {
			for (var i = arr.length - 1; i < fitSize - 1; i++) {
				arr.push(frmtPobj('0,0,0', 0))
			};
			return arr;
		};
	};

	var frmtPobj = function(a, b) {
		return {
			name: makeRGB(a),
			count: b
		};
	}


	// RGBaster Object
	// ---------------
	//
	var PALETTESIZE = 10;

	var RGBaster = {};

	RGBaster.colors = function(img, opts) {

		opts = opts || {};
		var exclude = opts.exclude || [], // for example, to exclude white and black:  [ '0,0,0', '255,255,255' ]
			paletteSize = opts.paletteSize || PALETTESIZE;

		getImageData(img, function(data) {

			var colorCounts = {},
				rgbString = '',
				rgb = [],
				colors = {
					dominant: {
						name: '',
						count: 0
					},
					palette: []
				};

			var i = 0;
			for (; i < data.length; i += 4) {
				rgb[0] = data[i];
				rgb[1] = data[i + 1];
				rgb[2] = data[i + 2];
				rgbString = rgb.join(",");

				// skip undefined data and transparent pixels
				if (rgb.indexOf(undefined) !== -1 || data[i + 3] === 0) {
					continue;
				}

				// Ignore those colors in the exclude list.
				if (exclude.indexOf(makeRGB(rgbString)) === -1) {
					if (rgbString in colorCounts) {
						colorCounts[rgbString] = colorCounts[rgbString] + 1;
					} else {
						colorCounts[rgbString] = 1;
					}
				}

			}

			if (opts.success) {
				var palette = fitPalette(mapPalette(colorCounts), paletteSize + 1);
				opts.success({
					dominant: palette[0].name,
					secondary: palette[1].name,
					palette: palette.map(function(c) {
						return c.name;
					}).slice(1)
				});
			}
		});
	};

	window.RGBaster = window.RGBaster || RGBaster;

})(window);

2、在页面中调用使用

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>获取图片主题色脚本基础示例</title>
  <script src="./rgb.js"></script>
</head>
<body>
<img src="https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1546500353,2204894501&fm=26&gp=0.jpg" alt="" id="image">
<div style="height:100px;width:100px;"></div>
<script type="text/javascript">
  var img = document.getElementById('image');

  RGBaster.colors(img, {
    success: function(payload) {
      // You now have the payload.
      // payload.dominant是主色,RGB形式表示
      // payload.secondary是次色,RGB形式表示
      // payload.palette是调色板,含多个主要颜色,数组
      console.log(payload.dominant);
      console.log(payload.secondary);
      console.log(payload.palette);
	  
	  
	  
	  var RgbValue = payload.dominant.replace("rgb(", "").replace(")", "");


			var RgbValueArry = RgbValue.split(",");

			var $grayLevel = RgbValueArry[0] * 0.299 + RgbValueArry[1] * 0.587 + RgbValueArry[2] * 0.114;

			if ($grayLevel >= 192) {
			  console.info('深色')
			} else {
			  console.info('浅色')
			}
    }
  });
</script>
</body>
</html>

3、可能存在的问题

1. 浏览器支持
由于使用Canvas的getImageData获得图片颜色信息(我之前的box-shadow图片生成工具也是用的这个), 因此,需要IE9+浏览器支持;同时,使用了XMLHttpRequest2.0, 貌似要IE10+可以畅快使用(据说IE8/IE9可以使用XDomainRequest对象实现类似功能,未研究,具体不详);

2. 跨域限制
XMLHttpRequest2.0获得图片数据,本地数据自然无障碍,对于跨域的数据,需要设置。宗旨就是,控制Access-Control-Allow-Origin,例如,你希望你站点的图片只有我站点可以访问,则想办法通过设置,使得请求信息中包含:

Access-Control-Allow-Origin: http://www.zhangxinxu.com

如果是所有站点,则:

Access-Control-Allow-Origin: *

不同的服务器设置是不一样的,大家自行百之谷之。

4、js 判断颜色是否为深色 阀值

//获取RGB值 颜色深用白色 颜色浅则用黑色


var RgbValue = this.style.backgroundColor.replace("rgb(", "").replace(")", "");


var RgbValueArry = RgbValue.split(",");

var $grayLevel = RgbValueArry[0] * 0.299 + RgbValueArry[1] * 0.587 + RgbValueArry[2] * 0.114;

$this.addClass("color_curr");

if ($grayLevel >= 192) {
  $this.html('<p class="fa fa-check color_black"></p>');
} else {
  $this.html('<p class="fa fa-check color_withe"></p>');
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值