• 图像处理------颜色梯度变化 (Color Gradient) 分类: 视频图像处理 2015-07-24 09:23 27人阅读 评论(0) 收藏


    有过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.   
    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. }  

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    NLP预训练模型+模型蒸馏与压缩
    treevalue——Master Nested Data Like Tensor
    vuecli项目根据线上环境分别打出测试包和生产包
    vue中移动端禁止页面滚动
    Iframe高度自适应
    Windows激活工具《KMS》
    使用宝塔面板部署商城项目到云服务器的案例
    电脑软件卸载神器
    react主动调用input file选择文件
    20192429马一 202120222 《汇编语言程序设计》前四章学习报告
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706379.html
Copyright © 2020-2023  润新知