有过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源代码如下:

  1. import java.awt.BorderLayout;
  2. import java.awt.Dimension;
  3. import java.awt.Graphics;
  4. import java.awt.Graphics2D;
  5. import java.awt.RenderingHints;
  6. import java.awt.image.BufferedImage;
  7. import javax.swing.JComponent;
  8. import javax.swing.JFrame;
  9. public class ColorGradientDemo extends JComponent {
  10. /**
  11. *
  12. */
  13. private static final long serialVersionUID = -4134440495899912869L;
  14. private BufferedImage image = null;
  15. protected void paintComponent(Graphics g) {
  16. Graphics2D g2 = (Graphics2D)g;
  17. g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  18. g2.drawImage(getImage(4), 5, 5, image.getWidth(), image.getHeight(), null);
  19. }
  20. public BufferedImage getImage(int type) {
  21. if(image == null) {
  22. image = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
  23. int[] rgbData = new int[256*256];
  24. if(type == 1) {
  25. generateVGradientImage(rgbData);
  26. } else if(type == 2) {
  27. generateHGradientImage(rgbData);
  28. } else {
  29. generateHVGradientImage(rgbData);
  30. }
  31. setRGB(image, 0, 0, 256, 256, rgbData);
  32. }
  33. return image;
  34. }
  35. private void generateVGradientImage(int[] rgbData) {
  36. int[] startColor = getStartColor();
  37. int[] endColor = getEndColor();
  38. float rr = startColor[0] - endColor[0];
  39. float gg = startColor[1] - endColor[1];
  40. float bb = startColor[2] - endColor[2];
  41. int a=255;
  42. int r=0, g=0, b=0;
  43. int index = 0;
  44. for(int row=0; row<256; row++) {
  45. for(int col=0; col<256; col++) {
  46. // set random color value for each pixel
  47. // set gradient color value for each pixel
  48. r = endColor[0] + (int)(rr * ((float)row/255.0f) + 0.5f);
  49. g = endColor[1] + (int)(gg * ((float)row/255.0f) + 0.5f);
  50. b = endColor[2] + (int)(bb * ((float)row/255.0f) + 0.5f);
  51. rgbData[index] = ((a & 0xff) << 24) |
  52. ((r & 0xff) << 16)  |
  53. ((g & 0xff) << 8)   |
  54. ((b & 0xff));
  55. index++;
  56. }
  57. }
  58. }
  59. private void generateHGradientImage(int[] rgbData) {
  60. int[] startColor = getStartColor();
  61. int[] endColor = getEndColor();
  62. float rr = startColor[0] - endColor[0];
  63. float gg = startColor[1] - endColor[1];
  64. float bb = startColor[2] - endColor[2];
  65. int a=255;
  66. int r=0, g=0, b=0;
  67. int index = 0;
  68. for(int row=0; row<256; row++) {
  69. for(int col=0; col<256; col++) {
  70. // set gradient color value for each pixel
  71. r = endColor[0] + (int)(rr * ((float)col/255.0f) + 0.5f);
  72. g = endColor[1] + (int)(gg * ((float)col/255.0f) + 0.5f);
  73. b = endColor[2] + (int)(bb * ((float)col/255.0f) + 0.5f);
  74. rgbData[index] = ((a & 0xff) << 24) |
  75. ((r & 0xff) << 16)  |
  76. ((g & 0xff) << 8)   |
  77. ((b & 0xff));
  78. index++;
  79. }
  80. }
  81. }
  82. private void generateHVGradientImage(int[] rgbData) {
  83. int[] startColor = getStartColor();
  84. int[] endColor = getEndColor();
  85. float rr = startColor[0] - endColor[0];
  86. float gg = startColor[1] - endColor[1];
  87. float bb = startColor[2] - endColor[2];
  88. int a=255;
  89. int r=0, g=0, b=0;
  90. int index = 0;
  91. float size = (float)Math.pow(255.0d, 2.0);
  92. for(int row=0; row<256; row++) {
  93. for(int col=0; col<256; col++) {
  94. // set random color value for each pixel
  95. r = endColor[0] + (int)(rr * (((float)col * (float)row)/size) + 0.5f);
  96. g = endColor[1] + (int)(gg * (((float)col * (float)row)/size) + 0.5f);
  97. b = endColor[2] + (int)(bb * (((float)col * (float)row)/size) + 0.5f);
  98. rgbData[index] = ((a & 0xff) << 24) |
  99. ((r & 0xff) << 16)  |
  100. ((g & 0xff) << 8)   |
  101. ((b & 0xff));
  102. index++;
  103. }
  104. }
  105. }
  106. public int[] getStartColor() {
  107. return new int[]{246,53,138};
  108. }
  109. public int[] getEndColor() {
  110. return new int[]{0,255,255};
  111. }
  112. public void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {
  113. int type = image.getType();
  114. if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )
  115. image.getRaster().setDataElements( x, y, width, height, pixels );
  116. else
  117. image.setRGB( x, y, width, height, pixels, 0, width );
  118. }
  119. public static void main(String[] args) {
  120. JFrame frame = new JFrame("Gradient Color Panel");
  121. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  122. frame.getContentPane().setLayout(new BorderLayout());
  123. // Display the window.
  124. frame.getContentPane().add(new ColorGradientDemo(), BorderLayout.CENTER);
  125. frame.setPreferredSize(new Dimension(280,305));
  126. frame.pack();
  127. frame.setVisible(true);
  128. }
  129. }

图像处理------颜色梯度变化 (Color Gradient)的更多相关文章

  1. 梯度下降(Gradient Descent)小结

    在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法.这里就对梯度下降法做一个完整的总结. 1. 梯度 在微 ...

  2. 梯度下降(Gradient Descent)

    在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法.这里就对梯度下降法做一个完整的总结. 1. 梯度 在微 ...

  3. [机器学习] ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)

    引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等,主要学习资料来自网上的免费课程和一些经典书籍,免费课 ...

  4. Delphi图像处理 -- 颜色矩阵变换

    转载自阿发伯:http://blog.csdn.net/maozefa/article/details/8316430 阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般 ...

  5. 16个基本颜色关键字 Basic color keywords

    16个基本颜色关键字 Basic color keywords Color Color Name HEX RGB   black #000000 0,0,0   silver #C0C0C0 192, ...

  6. 自然梯度(Natural Gradient)

    自然梯度(Natural Gradient)

  7. 机器学习算法的调试---梯度检验(Gradient Checking)

    梯度检验是一种对求导结果进行数值检验的方法,该方法可以验证求导代码是否正确. 1. 数学原理   考虑我们想要最小化以 θ 为自变量的目标函数 J(θ)(θ 可以为标量和可以为矢量,在 Numpy 的 ...

  8. 梯度下降(Gradient Descent)相关概念

    梯度,直观理解: 梯度: 运算的对像是纯量,运算出来的结果会是向量在一个标量场中, 梯度的计算结果会是"在每个位置都算出一个向量,而这个向量的方向会是在任何一点上从其周围(极接近的周围,学过 ...

  9. One-hot 编码/TF-IDF 值来提取特征,LAD/梯度下降法(Gradient Descent),Sigmoid

    1. 多值无序类数据的特征提取: 多值无序类问题(One-hot 编码)把“耐克”编码为[0,1,0],其中“1”代表了“耐克”的中 间位置,而且是唯一标识.同理我们可以把“中国”标识为[1,0],把 ...

随机推荐

  1. template.helper()方法

    上一篇文章我们已经讲到了helper()方法,但是上面的例子只是一个参数的写法,如果是多个参数,写法就另有区别了. <div id="user_info"></d ...

  2. python中的线程之semaphore信号量

    semaphore是一个内置的计数器 每当调用acquire()时,内置计数器-1 每当调用release()时,内置计数器+1 计数器不能小于0,当计数器为0时,acquire()将阻塞线程直到其他 ...

  3. SAS SATA SSD基本介绍

    SATA硬盘采用新的设计结构,数据传输快,节省空间,相对于IDE硬盘具有很多优势: 1 .SATA硬盘比IDE硬盘传输速度高.目前SATA可以提供150MB/s的高峰传输速率.今后将达到300 MB/ ...

  4. XML实体解析器的作用

    XML实体解析器的作用 什么是实体解析器 如果一个sax解析器需要实现对外部实体的自定义处理,那么必须实现一个EntityResolver接口并且注册到SAX驱动上. 从这段文字可以看出来,实体解析器 ...

  5. iOS学习——布局利器Masonry框架源码深度剖析

    iOS开发过程中很大一部分内容就是界面布局和跳转,iOS的布局方式也经历了 显式坐标定位方式 --> autoresizingMask --> iOS 6.0推出的自动布局(Auto La ...

  6. log4cpp退出时内存泄露的修复方案

    1.缘由 一直对log4cpp非常有好感,就在自己的项目中集成了log4cpp1.1.1版本,并围绕着它建立了一系列的封装函数方便外部调用.写完了一个测试代码后,忽然想看看自己写的程序有没有内存泄露问 ...

  7. 五、XML与xpath--------------爬取美女图片

    除了正则表达式处理HTML文档,我们还可以用XPath,先将 HTML文件 转换成 XML文档,然后用 XPath 查找 HTML 节点或元素. 先用一个小实例开头吧(爬去贴吧每个帖子的图片): im ...

  8. 【linux之shell脚本】

    一.简介 机器语言汇编语言高级语言 面向过程 C Shell Perl 面向对象 java python c++ 强语言:先编译再执行 java c++ 弱语言:边编译边执行 shell python ...

  9. [Python Study Notes]CS架构远程访问获取信息--Client端

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  10. 当inline元素包裹block元素时会发生什么

    经常有图片链接写法如下: <a href="www.baidu.com"><img src="baidu.jpg" /></a&g ...