图像处理------颜色梯度变化 (Color Gradient)

简介: <p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">有过UI设计经验的一定对2D图形渲染中的Color Gradient 或多或少有些接触,很多编程</p><p style="color: rgb(51, 51, 51); font-family: Arial;

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

[java]  view plain copy
  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.   
  8. import javax.swing.JComponent;  
  9. import javax.swing.JFrame;  
  10.   
  11. public class ColorGradientDemo extends JComponent {  
  12.   
  13.     /** 
  14.      *  
  15.      */  
  16.     private static final long serialVersionUID = -4134440495899912869L;  
  17.     private BufferedImage image = null;  
  18.       
  19.     protected void paintComponent(Graphics g) {  
  20.         Graphics2D g2 = (Graphics2D)g;  
  21.         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);  
  22.         g2.drawImage(getImage(4), 55, image.getWidth(), image.getHeight(), null);  
  23.     }  
  24.       
  25.     public BufferedImage getImage(int type) {  
  26.         if(image == null) {  
  27.             image = new BufferedImage(256256, BufferedImage.TYPE_INT_ARGB);  
  28.             int[] rgbData = new int[256*256];  
  29.             if(type == 1) {  
  30.                 generateVGradientImage(rgbData);  
  31.             } else if(type == 2) {  
  32.                 generateHGradientImage(rgbData);  
  33.             } else {  
  34.                 generateHVGradientImage(rgbData);  
  35.             }  
  36.             setRGB(image, 00256256, rgbData);  
  37.         }  
  38.         return image;  
  39.     }  
  40.   
  41.     private void generateVGradientImage(int[] rgbData) {  
  42.         int[] startColor = getStartColor();  
  43.         int[] endColor = getEndColor();  
  44.           
  45.         float rr = startColor[0] - endColor[0];  
  46.         float gg = startColor[1] - endColor[1];  
  47.         float bb = startColor[2] - endColor[2];  
  48.           
  49.         int a=255;  
  50.         int r=0, g=0, b=0;  
  51.         int index = 0;  
  52.         for(int row=0; row<256; row++) {  
  53.             for(int col=0; col<256; col++) {  
  54.                 // set random color value for each pixel  
  55.                 // set gradient color value for each pixel  
  56.                 r = endColor[0] + (int)(rr * ((float)row/255.0f) + 0.5f);  
  57.                 g = endColor[1] + (int)(gg * ((float)row/255.0f) + 0.5f);  
  58.                 b = endColor[2] + (int)(bb * ((float)row/255.0f) + 0.5f);  
  59.                   
  60.                 rgbData[index] = ((a & 0xff) << 24) |  
  61.                                 ((r & 0xff) << 16)  |  
  62.                                 ((g & 0xff) << 8)   |  
  63.                                 ((b & 0xff));  
  64.                 index++;  
  65.             }  
  66.         }  
  67.     }  
  68.       
  69.     private void generateHGradientImage(int[] rgbData) {  
  70.         int[] startColor = getStartColor();  
  71.         int[] endColor = getEndColor();  
  72.           
  73.         float rr = startColor[0] - endColor[0];  
  74.         float gg = startColor[1] - endColor[1];  
  75.         float bb = startColor[2] - endColor[2];  
  76.           
  77.         int a=255;  
  78.         int r=0, g=0, b=0;  
  79.         int index = 0;  
  80.         for(int row=0; row<256; row++) {  
  81.             for(int col=0; col<256; col++) {  
  82.                   
  83.                 // set gradient color value for each pixel  
  84.                 r = endColor[0] + (int)(rr * ((float)col/255.0f) + 0.5f);  
  85.                 g = endColor[1] + (int)(gg * ((float)col/255.0f) + 0.5f);  
  86.                 b = endColor[2] + (int)(bb * ((float)col/255.0f) + 0.5f);  
  87.                   
  88.                 rgbData[index] = ((a & 0xff) << 24) |  
  89.                                 ((r & 0xff) << 16)  |  
  90.                                 ((g & 0xff) << 8)   |  
  91.                                 ((b & 0xff));  
  92.                 index++;  
  93.             }  
  94.         }  
  95.     }  
  96.       
  97.     private void generateHVGradientImage(int[] rgbData) {  
  98.         int[] startColor = getStartColor();  
  99.         int[] endColor = getEndColor();  
  100.           
  101.         float rr = startColor[0] - endColor[0];  
  102.         float gg = startColor[1] - endColor[1];  
  103.         float bb = startColor[2] - endColor[2];  
  104.           
  105.         int a=255;  
  106.         int r=0, g=0, b=0;  
  107.         int index = 0;  
  108.         float size = (float)Math.pow(255.0d, 2.0);  
  109.         for(int row=0; row<256; row++) {  
  110.             for(int col=0; col<256; col++) {  
  111.                 // set random color value for each pixel  
  112.                 r = endColor[0] + (int)(rr * (((float)col * (float)row)/size) + 0.5f);  
  113.                 g = endColor[1] + (int)(gg * (((float)col * (float)row)/size) + 0.5f);  
  114.                 b = endColor[2] + (int)(bb * (((float)col * (float)row)/size) + 0.5f);  
  115.                   
  116.                 rgbData[index] = ((a & 0xff) << 24) |  
  117.                                 ((r & 0xff) << 16)  |  
  118.                                 ((g & 0xff) << 8)   |  
  119.                                 ((b & 0xff));  
  120.                 index++;  
  121.             }  
  122.         }  
  123.     }  
  124.       
  125.     public int[] getStartColor() {  
  126.         return new int[]{246,53,138};  
  127.     }  
  128.       
  129.     public int[] getEndColor() {  
  130.         return new int[]{0,255,255};  
  131.     }  
  132.       
  133.     public void setRGB( BufferedImage image, int x, int y, int width, int height, int[] pixels ) {  
  134.         int type = image.getType();  
  135.         if ( type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB )  
  136.             image.getRaster().setDataElements( x, y, width, height, pixels );  
  137.         else  
  138.             image.setRGB( x, y, width, height, pixels, 0, width );  
  139.     }  
  140.       
  141.     public static void main(String[] args) {  
  142.         JFrame frame = new JFrame("Gradient Color Panel");  
  143.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  144.         frame.getContentPane().setLayout(new BorderLayout());  
  145.           
  146.         // Display the window.  
  147.         frame.getContentPane().add(new ColorGradientDemo(), BorderLayout.CENTER);  
  148.         frame.setPreferredSize(new Dimension(280,305));  
  149.         frame.pack();  
  150.         frame.setVisible(true);  
  151.     }  
  152.   
  153. }  
相关文章
|
7月前
RGB颜色模型和HSV颜色模型
RGB颜色模型和HSV颜色模型“【5月更文挑战第22天】”
267 2
|
6月前
|
算法 Java 计算机视觉
图像处理之颜色梯度变化 (Color Gradient)
图像处理之颜色梯度变化 (Color Gradient)
84 0
|
6月前
|
算法 计算机视觉
图像处理之快速均值模糊(Box Blur)
图像处理之快速均值模糊(Box Blur)
50 0
|
7月前
|
算法 数据可视化
圆填充( CIRCLE PACKING)算法圆堆图圆形空间填充算法可视化
圆填充( CIRCLE PACKING)算法圆堆图圆形空间填充算法可视化
|
7月前
|
算法 计算机视觉 异构计算
yolo如何画框、如何变换目标检测框的颜色和粗细、如何运行detect脚本
yolo如何画框、如何变换目标检测框的颜色和粗细、如何运行detect脚本
|
图形学
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
452 1
|
算法
HSV颜色模型
HSV颜色模型
496 0
HSV颜色模型
【MATLAB】进阶绘图 ( fill 填充二维多边形 | fill 函数 | 绘制文字 | text 函数 )
【MATLAB】进阶绘图 ( fill 填充二维多边形 | fill 函数 | 绘制文字 | text 函数 )
932 0
【MATLAB】进阶绘图 ( fill 填充二维多边形 | fill 函数 | 绘制文字 | text 函数 )
|
算法
Halcon拟合系列(2)直线/圆/椭圆/矩形拟合算子fit_line_contour_xld/fit_circle_contour_xld/...
Halcon拟合系列(2)直线/圆/椭圆/矩形拟合算子fit_line_contour_xld/fit_circle_contour_xld/...
2282 0