zoukankan      html  css  js  c++  java
  • Java图像渐变

    图像渐变我们大体想一下思路无非是这样:将图像所有的像素点的RBG,每个点就减去相同的量,而且这个量是个渐变的量。是的,就是这样,我们的程序也是这个思路,不过就是没有单纯的“想”这么简单了。我这里只编写了纵向渐变,还没有写其他复杂的渐变,以后慢慢研究吧。先看效果: 

    原始图片: 


    图像变暗渐变: 


    图像变暗渐变: 


    图像变亮渐变: 


    图像变亮渐变: 


    我们以图像渐变暗举例,渐变亮同样的道理,无非是一个减,一个加。 
    1.我们要先拿到图片,这个不赘述了,就是获得图像的BufferedImage。 
    2.获得图像的宽度,高度,像素值,并创建一个存储图像像素信息DirectColorModel类dem。然后我们从dem中每一个像素值。我们给每一个像素都减去一个相同的像素值。并且伴随着图片的高度不同,每个像素点减去的值也是一个渐变的值。这里需要说明一下的是float beginPart,beginPart是渐变开始的位置,默认为1,就是从图像中间开始,beginPart<1从图像的中间偏上开始渐变,越小越偏上。beginPart>1从图像的中间偏下开始渐变,越大越偏上。 
    代码如下: 

    1. private int[] darkerPixels(BufferedImage originalPic, float beginPart) {  
    2.         // 得到图片的宽度。  
    3.         int imageWidth = originalPic.getWidth();  
    4.         // 得到图片的高度。  
    5.         int imageHeight = originalPic.getHeight();  
    6.         // 得到图片的像素值。  
    7.         int totalBlocks = imageWidth * imageHeight;  
    8.         // 创建相处值的存储空间。  
    9.         int[] pixels = new int[totalBlocks];  
    10.   
    11.         // 存储图像像素信息。  
    12.         DirectColorModel dem = new DirectColorModel(24, 0xff0000, 0x00ff00,  
    13.                 0x0000ff);  
    14.   
    15.         float inc = 255f / imageHeight / beginPart;  
    16.         int int_inc = 100;  
    17.         float float_inc = 0;  
    18.   
    19.         for (int i = 0; i < totalBlocks; i++) {  
    20.             if (i % imageHeight == 0 && i != 0) {  
    21.                 float_inc = float_inc + inc;  
    22.   
    23.                 int_inc = (int) (float_inc);  
    24.                 if (0 > int_inc) {  
    25.                     int_inc = 0;  
    26.                 }  
    27.   
    28.                 if (255 < int_inc) {  
    29.                     int_inc = 255;  
    30.                 }  
    31.             }  
    32.   
    33.             int a = dem.getAlphaMask() / 2;  
    34.   
    35.             int r = dem.getRed(pixels[i]) - int_inc;  
    36.             if (r < 0) {  
    37.                 r = 0;  
    38.             }  
    39.             int g = dem.getGreen(pixels[i]) - int_inc;  
    40.             if (g < 0) {  
    41.                 g = 0;  
    42.             }  
    43.             int b = dem.getBlue(pixels[i]) - int_inc;  
    44.             if (b < 0) {  
    45.                 b = 0;  
    46.             }  
    47.   
    48.             pixels[i] = a << 24 | r << 16 | g << 8 | b;  
    49.         }  
    50.         return pixels;  
    51.     }  


    3.利用改变后的像素点,生成一副新的图片。代码如下: 

      1. public final BufferedImage getGradualImg(BufferedImage originalPic) {  
      2.         // 设置渐变的开发位置,1为中间位置,小于1开始位置偏上,大于1开始位置偏下。  
      3.         float beginPart = 1f;  
      4.         // 得到图片的所有渐变后的像素点。  
      5.         int[] pixels = darkerPixels(originalPic, beginPart);  
      6.   
      7.         int imageWidth = originalPic.getWidth();  
      8.         int imageHeight = originalPic.getHeight();  
      9.         MemoryImageSource memoryimagesource = new MemoryImageSource(imageWidth,  
      10.                 imageHeight, new DirectColorModel(24, 0xff0000, 0x00ff00,  
      11.                         0x0000ff), pixels, 0, imageWidth);  
      12.         Image imageBuf = null;  
      13.         try {  
      14.             memoryimagesource.setAnimated(true);  
      15.             memoryimagesource.setFullBufferUpdates(true);  
      16.             imageBuf = this.createImage(memoryimagesource);  
      17.             // 生成新的图像  
      18.             memoryimagesource.newPixels();  
      19.   
      20.         } catch (NoSuchMethodError e) {  
      21.             e.printStackTrace();  
      22.         }  
      23.   
      24.         BufferedImage changedImage = new BufferedImage(imageWidth, imageHeight,  
      25.                 BufferedImage.TYPE_3BYTE_BGR);  
      26.         Graphics2D g2d = changedImage.createGraphics();  
      27.         g2d.drawImage(imageBuf, 0, 0, this);  
      28.   
      29.         return changedImage;  
      30.     } 
  • 相关阅读:
    python模块--time模块
    python模块--如何相互调用自己写的模块
    Animating Views Using Scenes and Transitions
    fragment 切换
    android textview 设置text 字体
    android intent 5.1
    android EditView ime
    animation of android (4)
    animation of android (3)
    animation of android (2)
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6722688.html
Copyright © 2011-2022 走看看