Java图像渐变

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


图像变暗渐变:


图像变暗渐变:


图像变亮渐变:


图像变亮渐变:


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

Java代码 复制代码
  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(240xff00000x00ff00,   
  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.     }  
private int[] darkerPixels(BufferedImage originalPic, float beginPart) { // 得到图片的宽度。 int imageWidth = originalPic.getWidth(); // 得到图片的高度。 int imageHeight = originalPic.getHeight(); // 得到图片的像素值。 int totalBlocks = imageWidth * imageHeight; // 创建相处值的存储空间。 int[] pixels = new int[totalBlocks]; // 存储图像像素信息。 DirectColorModel dem = new DirectColorModel(24, 0xff0000, 0x00ff00, 0x0000ff); float inc = 255f / imageHeight / beginPart; int int_inc = 100; float float_inc = 0; for (int i = 0; i < totalBlocks; i++) { if (i % imageHeight == 0 && i != 0) { float_inc = float_inc + inc; int_inc = (int) (float_inc); if (0 > int_inc) { int_inc = 0; } if (255 < int_inc) { int_inc = 255; } } int a = dem.getAlphaMask() / 2; int r = dem.getRed(pixels[i]) - int_inc; if (r < 0) { r = 0; } int g = dem.getGreen(pixels[i]) - int_inc; if (g < 0) { g = 0; } int b = dem.getBlue(pixels[i]) - int_inc; if (b < 0) { b = 0; } pixels[i] = a << 24 | r << 16 | g << 8 | b; } return pixels; }
3.利用改变后的像素点,生成一副新的图片。代码如下:

 

Java代码 复制代码
  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(240xff00000x00ff00,   
  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, 00this);   
  28.   
  29.         return changedImage;   
  30.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值