图像处理------颜色梯度变化 (Color Gradient)
有过UI设计经验的一定对2D图形渲染中的Color Gradient 或多或少有些接触,很多编程
语言也提供了Gradient的接口,但是想知道它是怎么实现的嘛?
本文介绍三种简单的颜色梯度变化算法,就可以很容易实现常见的梯度变化算法
三种都要求提供两个参数即起始颜色RGB值, 最终颜色RGB的值。
垂直梯度颜色变化,效果如下:

水平梯度颜色变化,效果如下:

水平与垂直两个方向叠加梯度变化效果如下:

算法代码及其解释
计算起始颜色和终点颜色RGB之间差值代码如下:
float rr = startColor[0] - endColor[0];
float gg = startColor[1] - endColor[1];
float bb = startColor[2] - endColor[2];
实现垂直梯度变化的代码如下:
r = endColor[0] + (int)(rr * ((float)row/255.0f) +0.5f);
g = endColor[1] + (int)(gg * ((float)row/255.0f) +0.5f);
b = endColor[2] + (int)(bb * ((float)row/255.0f) +0.5f);
实现水平梯度变化代码如下:
// set gradient color valuefor each pixel
r = endColor[0] + (int)(rr * ((float)col/255.0f) +0.5f);
g = endColor[1] + (int)(gg * ((float)col/255.0f) + 0.5f);
b = endColor[2] + (int)(bb * ((float)col/255.0f) +0.5f);
实现水平和垂直两个方向上Gradient叠加代码如下:
r = endColor[0] + (int)(rr * (((float)col * (float)row)/size) +0.5f);
g = endColor[1] + (int)(gg * (((float)col * (float)row)/size) +0.5f);
b = endColor[2] + (int)(bb * (((float)col * (float)row)/size) +0.5f);
程序对上面三种Gradient方法分别放在三个不同的方法中,根据参数调用。
程序的完全Java源代码如下:
- import java.awt.BorderLayout;
- import java.awt.Dimension;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.RenderingHints;
- import java.awt.image.BufferedImage;
- import javax.swing.JComponent;
- import javax.swing.JFrame;
- public class ColorGradientDemo extends JComponent {
- /**
- *
- */
- private static final long serialVersionUID = -4134440495899912869L;
- private BufferedImage image = null;
- protected void paintComponent(Graphics g) {
- Graphics2D g2 = (Graphics2D)g;
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g2.drawImage(getImage(4), 5, 5, image.getWidth(), image.getHeight(), null);
- }
- public BufferedImage getImage(int type) {
- if(image == null) {
- image = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
- int[] rgbData = new int[256*256];
- if(type == 1) {
- generateVGradientImage(rgbData);
- } else if(type == 2) {
- generateHGradientImage(rgbData);
- } else {
- generateHVGradientImage(rgbData);
- }
- setRGB(image, 0, 0, 256, 256, rgbData);
- }
- return image;
- }
- private void generateVGradientImage(int[] rgbData) {
- int[] startColor = getStartColor();
- int[] endColor = getEndColor();
- float rr = startColor[0] - endColor[0];
- float gg = startColor[1] - endColor[1];
- float bb = startColor[2] - endColor[2];
- int a=255;
- int r=0, g=0, b=0;
- int index = 0;
- for(int row=0; row<256; row++) {
- for(int col=0; col<256; col++) {
- // set random color value for each pixel
- // set gradient color value for each pixel
- r = endColor[0] + (int)(rr * ((float)row/255.0f) + 0.5f);
- g = endColor[1] + (int)(gg * ((float)row/255.0f) + 0.5f);
- b = endColor[2] + (int)(bb * ((float)row/255.0f) + 0.5f);
- rgbData[index] = ((a & 0xff) << 24) |
- ((r & 0xff) << 16) |
- ((g & 0xff) << 8) |
- ((b & 0xff));
- index++;
- }
- }
- }
- private void generateHGradientImage(int[] rgbData) {
- int[] startColor = getStartColor();
- int[] endColor = getEndColor();
- float rr = startColor[0] - endColor[0];
- float gg = startColor[1] - endColor[1];
- float bb = startColor[2] - endColor[2];
- int a=255;
- int r=0, g=0, b=0;
- int index = 0;
- for(int row=0; row<256; row++) {
- for(int col=0; col<256; col++) {
- // set gradient color value for each pixel
- r = endColor[0] + (int)(rr * ((float)col/255.0f) + 0.5f);
- g = endColor[1] + (int)(gg * ((float)col/255.0f) + 0.5f);
- b = endColor[2] + (int)(bb * ((float)col/255.0f) + 0.5f);
- rgbData[index] = ((a & 0xff) << 24) |
- ((r & 0xff) << 16) |
- ((g & 0xff) << 8) |
- ((b & 0xff));
- index++;
- }
- }
- }
- private void generateHVGradientImage(int[] rgbData) {
- int[] startColor = getStartColor();
- int[] endColor = getEndColor();
- float rr = startColor[0] - endColor[0];
- float gg = startColor[1] - endColor[1];
- float bb = startColor[2] - endColor[2];
- int a=255;
- int r=0, g=0, b=0;
- int index = 0;
- float size = (float)Math.pow(255.0d, 2.0);
- for(int row=0; row<256; row++) {
- for(int col=0; col<256; col++) {
- // set random color value for each pixel
- r = endColor[0] + (int)(rr * (((float)col * (float)row)/size) + 0.5f);
- g = endColor[1] + (int)(gg * (((float)col * (float)row)/size) + 0.5f);
- b = endColor[2] + (int)(bb * (((float)col * (float)row)/size) + 0.5f);
- rgbData[index] = ((a & 0xff) << 24) |
- ((r & 0xff) << 16) |
- ((g & 0xff) << 8) |
- ((b & 0xff));
- index++;
- }
- }
- }
- public int[] getStartColor() {
- return new int[]{246,53,138};
- }
- public int[] getEndColor() {
- return new int[]{0,255,255};
- }
- public void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {
- int type = image.getType();
- if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
- image.getRaster().setDataElements( x, y, width, height, pixels );
- else
- image.setRGB( x, y, width, height, pixels, 0, width );
- }
- public static void main(String[] args) {
- JFrame frame = new JFrame("Gradient Color Panel");
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.getContentPane().setLayout(new BorderLayout());
- // Display the window.
- frame.getContentPane().add(new ColorGradientDemo(), BorderLayout.CENTER);
- frame.setPreferredSize(new Dimension(280,305));
- frame.pack();
- frame.setVisible(true);
- }
- }
图像处理------颜色梯度变化 (Color Gradient)的更多相关文章
- 梯度下降(Gradient Descent)小结
在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法.这里就对梯度下降法做一个完整的总结. 1. 梯度 在微 ...
- 梯度下降(Gradient Descent)
在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法.这里就对梯度下降法做一个完整的总结. 1. 梯度 在微 ...
- [机器学习] ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)
引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等,主要学习资料来自网上的免费课程和一些经典书籍,免费课 ...
- Delphi图像处理 -- 颜色矩阵变换
转载自阿发伯:http://blog.csdn.net/maozefa/article/details/8316430 阅读提示: <Delphi图像处理>系列以效率为侧重点,一般 ...
- 16个基本颜色关键字 Basic color keywords
16个基本颜色关键字 Basic color keywords Color Color Name HEX RGB black #000000 0,0,0 silver #C0C0C0 192, ...
- 自然梯度(Natural Gradient)
自然梯度(Natural Gradient)
- 机器学习算法的调试---梯度检验(Gradient Checking)
梯度检验是一种对求导结果进行数值检验的方法,该方法可以验证求导代码是否正确. 1. 数学原理 考虑我们想要最小化以 θ 为自变量的目标函数 J(θ)(θ 可以为标量和可以为矢量,在 Numpy 的 ...
- 梯度下降(Gradient Descent)相关概念
梯度,直观理解: 梯度: 运算的对像是纯量,运算出来的结果会是向量在一个标量场中, 梯度的计算结果会是"在每个位置都算出一个向量,而这个向量的方向会是在任何一点上从其周围(极接近的周围,学过 ...
- One-hot 编码/TF-IDF 值来提取特征,LAD/梯度下降法(Gradient Descent),Sigmoid
1. 多值无序类数据的特征提取: 多值无序类问题(One-hot 编码)把“耐克”编码为[0,1,0],其中“1”代表了“耐克”的中 间位置,而且是唯一标识.同理我们可以把“中国”标识为[1,0],把 ...
随机推荐
- MVC思想概述
一. 传统Model1和Model2 Model1:整个web应用几乎全部用JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接作出响应.用少量的javaBean来处理数据库链接,数据库访问 ...
- 使用命令行生成jar包
测试用类 public class Hello { public static void main(String[] args) { System.out.println("hello wo ...
- mkdir与mkdirs的区别
mkdir与mkdirs的区别 项目中需要在代码中读取或创建文件保存路径,用到了mkdir,查看还有个mkdirs方法,这里记录一下两者的区别. 1.关于两者的说明如下: boolean mkdir( ...
- centos 编译安装net-snmp 5.6.2
1.准备环境 yum -y install make gcc gcc-c++ gcc-g77 openssl openssl-devel 常用lib安装可参照本文 2.编译和安装 首先我们需要下载Ne ...
- centos yum方式安装net-snmp v3
SNMPv3的安全报头采用用户安全模式(USM),其提供具有机密性和完整性的网络管理通信.机密性通过采用数据加密标准(DES)来提供.尽管 这一算法以脆弱性著称(由于它采用的是40位的密钥),但与明文 ...
- 不需要客户端插件PHP也能实现单点登录
分析CAS原理,构建PHP单点登录 单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户 只需要登录一次就 ...
- Yii框架里用grid.CGridView调用pager扩展不显示最后一页按钮的解决
有如下一例,调用zii.widgets.grid.CGridView显示Blog信息,代码如下: $this->widget('zii.widgets.grid.CGridView', arra ...
- bzoj 3451: Tyvj1953 Normal [fft 点分治 期望]
3451: Tyvj1953 Normal 题意: N 个点的树,点分治时等概率地随机选点,代价为当前连通块的顶点数量,求代价的期望值 百年难遇的点分治一遍AC!!! 今天又去翻了一下<具体数学 ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 [广义后缀自动机 Trie]
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1124 Solved: 660[Submit][S ...
- 【转】如何解决plsql查询oracle数据库语句where条件带有中文无法匹配结果
一.问题描述 之前使用PLSQL查询oracle数据库可以正常查询统计结果,由于换了个电脑,重新安装之后,同样的sql查询语句同一个数据库,无法正常查询结果,如下图所示 二.解决办法 1. 查询数据当 ...