首页 前端知识 在Html5中仿Matlab自定义色带生成实践

在Html5中仿Matlab自定义色带生成实践

2025-03-12 12:03:36 前端知识 前端哥 100 843 我要收藏

目录

前言

一、RGB的相关知识

1、RGB的基本原理

2、RGB的数值表示

3、应用场景

二、ColorMap生成实战

1、外部库介绍

2、相关API

3、实例生成

三、总结


前言

        在现代网页开发与数据可视化领域,色彩的表现力对于信息传达和视觉体验起着至关重要的作用。色带,作为一种有效的色彩组织和展示形式,广泛应用于科学研究、工程绘图、地理信息系统(GIS)以及商业数据展示等多个领域。它能够将数据值映射到特定的颜色,从而使得复杂的数据分布以直观的视觉形式呈现出来。如下图的应用:

        比如在常见的科研工具中,Matlab作为一款功能强大的科学计算与可视化软件,在色带生成与应用方面拥有成熟且便捷的工具集。其内置的多种色带模式以及灵活的自定义选项,为科研人员和工程师提供了高效的数据可视化解决方案。然而,随着互联网技术的发展和Web应用的普及,越来越多的数据可视化需求开始转向网页平台。Html5作为现代网页开发的核心标准,提供了丰富的绘图和渲染功能,使得在网页上实现复杂的图形和图像处理成为可能。

        在实践过程中,开发者可能会面临一些挑战。例如,Matlab和Html5在色彩处理和图形绘制方面存在一定的差异,如何准确地将Matlab的色带效果转化为Html5中的实现是一个需要解决的问题。此外,不同浏览器对Html5和CSS3特性的支持程度不一致,可能导致色带在某些浏览器中显示异常,需要进行充分的兼容性测试和优化。总之,在Html5中仿Matlab自定义色带生成实践,为网页数据可视化提供了一种新的思路和方法。通过深入理解Matlab色带的原理和巧妙运用Html5的绘图功能,开发者能够在网页上实现具有专业水准的色彩效果,满足多样化的数据展示需求。随着技术的不断进步和开发者的不断创新,这一领域的应用前景将更加广阔。本文即在此背景下产生,文章主要讲解如何在Html5中生成类似Matlab的色带应用,通过本文您可以熟悉并掌握生成方法,为下一步进行gis的空间自定义分类制图打下颜色制图的基础。

一、RGB的相关知识

        在数字媒体、计算机图形学以及现代显示技术等领域,RGB颜色模型作为色彩表示与呈现的核心手段,发挥着至关重要的作用。RGB颜色模型基于光的加色原理,通过红(Red)、绿(Green)、蓝(Blue)三种基本色光的强度组合,能够产生人类视觉所能感知的绝大多数颜色,为我们在屏幕上创造出丰富多彩的视觉体验提供了可能。

1、RGB的基本原理

        RGB颜色模型源于人类视觉系统对红、绿、蓝三种光的敏感性。这三种颜色被称为光的三原色,因为它们无法通过其他颜色的混合得到,但却可以组合生成其他各种颜色。在数字设备中,如显示器、手机屏幕等,每个像素点都由红、绿、蓝三种子像素组成,通过调整这三种子像素的亮度,就能控制该像素点最终显示的颜色。例如,当红、绿、蓝三种子像素的亮度都达到最大时,像素点呈现为白色;当三种子像素的亮度都为零时,像素点则为黑色。

2、RGB的数值表示

        在RGB颜色模型中,每种基本颜色的强度通常用0到255之间的整数来表示。0表示该颜色完全不发光,255表示该颜色以最大强度发光。因此,一个完整的RGB颜色值由三个数值组成,分别对应红、绿、蓝三种颜色的强度。例如,RGB(255,0,0)表示纯红色,RGB(0,255,0)表示纯绿色,RGB(0,0,255)表示纯蓝色。而RGB(255,255,255)则表示白色,RGB(0,0,0)表示黑色。这种数值表示方法使得计算机能够方便地存储、处理和传输颜色信息,为数字图像的处理和显示提供了基础。在Html网页中,我们可以打开颜色拾取器,通过颜色拾取器可以看到颜色的RGB值,查看方法如下:

        通过颜色拾取器就能实现。 如果当前您的网页是展示的是Hex表示的颜色,通过上下键可以切换不同的展示模式,通过切换后就可以实现RGB格式的颜色展示模式。

3、应用场景

        RGB颜色模型在现代科技和日常生活中有着广泛的应用。在计算机显示器、电视屏幕、手机显示屏等电子设备上,RGB是默认的颜色标准,所有的图像、视频和用户界面元素都是基于RGB颜色模型来设计和显示的。在网页设计和网络媒体中,RGB颜色模型也是主要的颜色表示方式,通过HTML和CSS代码中的RGB值设置,可以精确控制网页元素的颜色,实现各种视觉效果。此外,在摄影、影视制作、数字绘画等领域,创作者们也依赖RGB颜色模型来呈现他们的作品,通过调整RGB值来实现理想的色彩效果和艺术风格。

二、ColorMap生成实战

        在介绍了有关于Html中RGB的颜色生成原理、数值表示以及应用场景之后。本节将中点来讲解如何基于Javascript的色带生成。这里需要使用一个外部的Javascript,这个是生成色带的关键代码。其次重点介绍这个API库,最后根据API生成相关的具体示例。通过这些实例的生成,让你对整个过程有更详细的了解。

1、外部库介绍

        生成色带的Javascript源码本身不复杂,这里直接将整个生成的源码库代码贴出来,

/**
 * Colormaps.js - a general set of utilities for dealing with colors and stuff
 * Author: Yue Zhang
 * */

function ColorScheme(name, minValue, maxValue, minr, maxr, ming, maxg, minb, maxb) {
    this.name = name;
    this.minValue = minValue;
    this.maxValue = maxValue;
    this.minr = minr;
    this.maxr = maxr;
    this.ming = ming;
    this.maxg = maxg;
    this.minb = minb;
    this.maxb = maxb;
}

function Color(r, g, b) {
    this.r = r;
    this.g = g;
    this.b = b;
}

Color.prototype.toString = function() {
    return "rgb("+parseInt(this.r)+","+parseInt(this.g)+","+parseInt(this.b)+")";
}

Color.prototype.toHex = function() {
    var r = parseInt(this.r);
    var g = parseInt(this.g);
    var b = parseInt(this.b);
}

function MultiColorScheme(name, minValue, maxValue, colors) {
    this.name = name;
    this.minValue = minValue;
    this.maxValue = maxValue;
    this.colors = colors;
    //colorStops is the locations of each color on the gradient.
    this.colorStops = [];
    for (var i = 0; i<this.colors.length; i++) {
        this.colorStops = 
            this.colorStops.concat(i*(maxValue-minValue)/(this.colors.length-1));
    }
}

/**
 * Given a value, and the min and max of that value, returns the color that
 * corresponds to that value for the given colorScheme.
 * */
function makeMultiColor(value, min, max, colorScheme) {
    var colors = colorScheme.colors;
    var colorStops = [];
    for (var i = 0; i<colorScheme.colors.length; i++) {
        colorStops = 
            colorStops.concat(min + i*(max - min)/(colors.length-1));
    }
    for (var i = 1; i<colorScheme.colors.length; i++) {
        if (value <= colorStops[i]+0.01 &&  value >= colorStops[i-1]) {
            var cMin = colorStops[i-1];
            var cMax = colorStops[i];
            var r = interpolate(value, cMin, cMax, colors[i-1].r, colors[i].r);
            var g = interpolate(value, cMin, cMax, colors[i-1].g, colors[i].g);
            var b = interpolate(value, cMin, cMax, colors[i-1].b, colors[i].b);
            return "rgb("+parseInt(r)+","+parseInt(g)+","+parseInt(b)+")";
        }
    }
    return "rgb(255,255,255)";
}

function HeatMap(name, values){
    this.name = name;
    this.values = values;
    this.colors = [];
    this.xpos = 0;
    this.ypos = 0;
}

function interpolate(pos1, min1, max1, min2, max2) {
    return (max2-min2)*(pos1-min1)/(max1-min1)+min2;
}

/**
* Given a value and the min and max possible values for that value,
* returns a color that represents the color in the color scheme.
* */
function makeColor(value, min, max, colorScheme) {
    if (colorScheme instanceof MultiColorScheme) {
        return makeMultiColor(value, min, max, colorScheme);
    }
    else {
        var colorR = interpolate(value, min, max,
        colorScheme.minr, colorScheme.maxr);
        var colorG = interpolate(value, min, max,
        colorScheme.ming, colorScheme.maxg);
        var colorB = interpolate(value, min, max,
        colorScheme.minb, colorScheme.maxb);
        //Colors have to be ints
        return "rgb("+parseInt(colorR)+","+parseInt(colorG)+","+
        parseInt(colorB)+")";
    }
}

/**
* Given a heat map without colors
*  and a color scheme, gives the heat map colors.
* */
function makeColors(heatMap, colorScheme) {
    for (var i = 0; i<heatMap.values.length; i++) {
        if (LOGARITHMIC) {
            heatMap.values[i] = Math.log(heatMap.values[i])/Math.log(2);
        }
        var value = heatMap.values[i];
        var color = makeColor(value, colorScheme.minValue, colorScheme.maxValue,
        colorScheme);
        //if the value is not positive, the color is white.
        if (value <= 0) {
            heatMap.colors = heatMap.colors.concat("rgb(255,255,255)");
        }
        else {
            //Colors have to be ints
            heatMap.colors = heatMap.colors.concat(color);
        }
    }
}

/**
* Draws a color map for the given color scheme onto the given canvas.
* */
function drawColorMap(canvas, colorScheme, maxValue, minValue) {
    var context = canvas.getContext('2d');
    context.clearRect(0, 0, canvas.width, canvas.height);
    var width = canvas.width;
    var height = canvas.height;
    var gradient = context.createLinearGradient(0, 0, width, 0);
    if (colorScheme instanceof MultiColorScheme) {
        for (var i = 0; i<colorScheme.colorStops.length; i++) {
            gradient.addColorStop(colorScheme.colorStops[i]/colorScheme.maxValue, 
                colorScheme.colors[i].toString());
        }
    }
    else {
        gradient.addColorStop(0, makeColor(0, 0, width, colorScheme));
        gradient.addColorStop(1, makeColor(width, 0, width, colorScheme));
    }
    context.fillStyle = gradient;
    //context.fillRect(0, 0, width, height/2);
	context.fillRect(0, 0, width, height);
    //writing text
    context.fillStyle = "rgb(0,0,0)";
}

//GLOBAL color schemes
//Red is high, green is low
var GREEN_RED_SCHEME = new ColorScheme('redGreen', 0, 1000, 0, 255, 255, 0, 0, 0);
//Red is high, blue is low
var BLUE_RED_SCHEME = new ColorScheme('blueRed', 0, 1000, 0, 255, 0, 0, 255, 0);
//Red is high, yellow is low
var YELLOW_RED_SCHEME = new ColorScheme('yellowRed', 0, 1000, 255, 255, 255, 0, 0, 0);
//Blue is high, white is low
var WHITE_BLUE_SCHEME = new ColorScheme('whiteBlue', 0, 1000, 255, 0, 255, 0, 255, 255);
//Green is high, blue is low
var BLUE_GREEN_SCHEME = new ColorScheme('blueGreen', 0, 1000, 0, 0, 0, 255, 255, 0);
//White, yellow, red, black color scheme
var YELLOW_RED_BLACK_SCHEME = new MultiColorScheme('', 0, 1000, 
    [new Color(255,255,0),
    new Color(255,0,0),
    new Color(0,0,0)]);
var BLUE_WHITE_RED_SCHEME = new MultiColorScheme('', 0, 1000,
        [new Color(255, 0, 0),
        new Color(255, 255, 255),
        new Color(0, 0, 255)]);
var BLUE_GREEN_YELLOW_RED_SCHEME = new MultiColorScheme('', 0, 1000,
    [new Color(0, 0, 255),
    new Color(0, 255, 255),
    new Color(0, 255, 0),
    new Color(255,255,0),
    new Color(255,0,0)]);

var colorSchemes = {'GREEN_RED_SCHEME':GREEN_RED_SCHEME, 'BLUE_RED_SCHEME':BLUE_RED_SCHEME,
'YELLOW_RED_SCHEME':YELLOW_RED_SCHEME, 'WHITE_BLUE_SCHEME':WHITE_BLUE_SCHEME,
'BLUE_GREEN_SCHEME':BLUE_GREEN_SCHEME,
'YELLOW_RED_BLACK_SCHEME':YELLOW_RED_BLACK_SCHEME,
'BLUE_GREEN_YELLOW_RED_SCHEME':BLUE_GREEN_YELLOW_RED_SCHEME,
'BLUE_WHITE_RED_SCHEME': BLUE_WHITE_RED_SCHEME};

2、相关API

        在上面的方法中,有几个地方是重点需要注意的。第一个是通过RGB来构建Color对象。在Javascript代码中传入RGB值构建的代码如下:

function Color(r, g, b) {
    this.r = r;
    this.g = g;
    this.b = b;
}

        其次是根据自定义的颜色及分区来构建渐变的色带,关键方法如下:

function MultiColorScheme(name, minValue, maxValue, colors) {
    this.name = name;
    this.minValue = minValue;
    this.maxValue = maxValue;
    this.colors = colors;
    //colorStops is the locations of each color on the gradient.
    this.colorStops = [];
    for (var i = 0; i<this.colors.length; i++) {
        this.colorStops = 
            this.colorStops.concat(i*(maxValue-minValue)/(this.colors.length-1));
    }
}

        需要注意的是,这里传入的colors数组即是前面通过RGB值构建出来的颜色数组,生成之后就是我们期望的色带值。 为了直观的展示色带的生成效果,我们在Html5中将根据色带的渐变色去填充canvas,以此来进行效果的展示。使用色带来填充canvas的方法如下:

/**
* Draws a color map for the given color scheme onto the given canvas.
* */
function drawColorMap(canvas, colorScheme, maxValue, minValue) {
    var context = canvas.getContext('2d');
    context.clearRect(0, 0, canvas.width, canvas.height);
    var width = canvas.width;
    var height = canvas.height;
    var gradient = context.createLinearGradient(0, 0, width, 0);
    if (colorScheme instanceof MultiColorScheme) {
        for (var i = 0; i<colorScheme.colorStops.length; i++) {
            gradient.addColorStop(colorScheme.colorStops[i]/colorScheme.maxValue, 
                colorScheme.colors[i].toString());
        }
    }
    else {
        gradient.addColorStop(0, makeColor(0, 0, width, colorScheme));
        gradient.addColorStop(1, makeColor(width, 0, width, colorScheme));
    }
    context.fillStyle = gradient;
	context.fillRect(0, 0, width, height);
    context.fillStyle = "rgb(0,0,0)";
}

3、实例生成

        最后我们新建一个Html,在这个Html中将使用一个Table表格,然后在页面加载的时候,通过调用预制的色带对象来进行页面渲染,同时我们还演示了一个自定义的颜色区间生成。实例代码如下:


<!DOCTYPE html>
<html>
<head>
  <title>colormap自定义色带生成实战</title>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <script src="./colormaps.js"></script>
  <style type="text/css">
    body {
       margin: 0;
       padding: 0;
    }
	
	table {
		border-collapse: collapse;
		width: 95%;
		margin: 10px auto;
	}
	th, td {
		border: 1px solid black;
		padding: 3px;
		text-align: left;
	}
	th {
		background-color: #f2f2f2;
	}
    
  </style>
</head>
<body>
	
  
	<table>
        <tr>
            <th width="20%">色带值</th>
            <th width="80%">色带效果</th>
        </tr>
        <tr>
            <td>GREEN_RED_SCHEME</td>
            <td>
				<canvas id="myCanvas" width="1024" height="40" ></canvas>
			</td>
        </tr>
        <tr>
            <td>BLUE_RED_SCHEME</td>
            <td>
				<canvas id="myCanvas1" width="1024" height="40" ></canvas>
			</td>
        </tr>
        <tr>
            <td>YELLOW_RED_SCHEME</td>
            <td>
				<canvas id="myCanvas2" width="1024" height="40" ></canvas>
			</td>
        </tr>
        <tr>
            <td>WHITE_BLUE_SCHEME</td>
            <td>
				<canvas id="myCanvas3" width="1024" height="40" ></canvas>
			</td>
        </tr>
        <tr>
            <td>YELLOW_RED_BLACK_SCHEME</td>
            <td>
				<canvas id="myCanvas4" width="1024" height="40" ></canvas>
			</td>
        </tr>
		<tr>
            <td>YELLOW_RED_SCHEME</td>
            <td>
				<canvas id="myCanvas5" width="1024" height="40" ></canvas>
			</td>
        </tr>
        <tr>
            <td>WHITE_BLUE_SCHEME</td>
            <td>
				<canvas id="myCanvas6" width="1024" height="40" ></canvas>
			</td>
        </tr>
        <tr>
            <td>YELLOW_RED_BLACK_SCHEME</td>
            <td>
				<canvas id="myCanvas7" width="1024" height="40" ></canvas>
			</td>
        </tr>
		
		<tr>
            <td>自定义1</td>
            <td>
				<canvas id="myCanvas8" width="1024" height="40" ></canvas>
			</td>
        </tr>
        <tr>
            <td>自定义2</td>
            <td>
				<canvas id="myCanvas9" width="1024" height="40" ></canvas>
			</td>
        </tr>
        <tr>
            <td>自定义3</td>
            <td>
				<canvas id="myCanvas10" width="1024" height="40" ></canvas>
			</td>
        </tr>
    </table>
</body>
</html>

        然后在页面中调用色带对象进行canvas的绑定,代码如下:

<script>
		window.onload = function() {
			console.log(colorSchemes);
			drawColorMap( document.getElementById('myCanvas'), GREEN_RED_SCHEME, 100, 0);
			drawColorMap( document.getElementById('myCanvas1'), BLUE_RED_SCHEME, 1000, 0);
			drawColorMap( document.getElementById('myCanvas2'), YELLOW_RED_SCHEME, 1000, 0);
			drawColorMap( document.getElementById('myCanvas3'), WHITE_BLUE_SCHEME, 1000, 0);
			drawColorMap( document.getElementById('myCanvas4'), BLUE_GREEN_SCHEME, 1000, 0);
			drawColorMap( document.getElementById('myCanvas5'), YELLOW_RED_BLACK_SCHEME, 1000, 0);
			drawColorMap( document.getElementById('myCanvas6'), BLUE_WHITE_RED_SCHEME, 1000, 0);
			drawColorMap( document.getElementById('myCanvas7'), BLUE_GREEN_YELLOW_RED_SCHEME, 1000, 0);
			
			drawColorMap( document.getElementById('myCanvas8'), new ColorScheme('diy1', 0, 1000, 0, 35, 2, 50, 61, 90), 1000, 0);
			drawColorMap( document.getElementById('myCanvas9'), new ColorScheme('diy2', 0, 1000, 190, 255, 50, 50, 61, 0), 1000, 0);
			drawColorMap( document.getElementById('myCanvas10'), new MultiColorScheme('', 0, 1000,[new Color(190, 27, 231),
																	new Color(7, 229, 96),
																	new Color(207, 10, 37)]), 1000, 0);
		}
  </script>

         最后呈现出来的就是如下的实际效果:

        在实际开发当中,如果想从色带中获取指定值的颜色,可以通过以下方法:

        通过这个方法就可以返回该值对应的RGB颜色:

makeColor(260,0,1000,GREEN_RED_SCHEME);
'rgb(66,188,0)'

三、总结

        以上就是本文的主要内容,文章主要讲解如何在Html5中生成类似Matlab的色带应用,通过本文您可以熟悉并掌握生成方法,为下一步进行gis的空间自定义分类制图打下颜色制图的基础。博文首先讲解了RGB的相关知识,它的数值表示以及使用场景。然后重点介绍了ColorMap的生成库及其相关的API方法,最后基于colormap构建了一个色带生成的实例,以及如何来自动生成色带。相信通过博文的内容讲解,大家对如何在Html页面中生成色带有了进一步的了解。行文仓促,定有不当之处,恳请各位专家学者博友在评论区留下宝贵的意见,万分感激。

        相关源码传送门:在Html5中生成仿Matlab色带效果源码。

转载请注明出处或者链接地址:https://www.qianduange.cn//article/23414.html
评论
发布的文章

linux常见操作命令

2025-03-05 18:03:10

GPT-4.5

2025-03-12 12:03:19

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!