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.     } 
  • 相关阅读:
    JDBC 访问数据库的流程
    JSP中两种include的区别
    javascript中循环语句 while、dowhile、forin、for用法区别
    php正则取得页面所有的图片地址
    php基础入门篇学习笔记
    php正则表达匹配中文问题分析
    .htaccess 301重定向详细教程
    忘记mysql的root密码重置方法
    php for循环语句的几种用法分析
    javascript邮箱验证代码分析
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6722688.html
Copyright © 2011-2022 走看看