图像渐变我们大体想一下思路无非是这样:将图像所有的像素点的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. DirectColorModel dem = new DirectColorModel(24, 0xff0000, 0x00ff00,
  12. 0x0000ff);
  13. float inc = 255f / imageHeight / beginPart;
  14. int int_inc = 100;
  15. float float_inc = 0;
  16. for (int i = 0; i < totalBlocks; i++) {
  17. if (i % imageHeight == 0 && i != 0) {
  18. float_inc = float_inc + inc;
  19. int_inc = (int) (float_inc);
  20. if (0 > int_inc) {
  21. int_inc = 0;
  22. }
  23. if (255 < int_inc) {
  24. int_inc = 255;
  25. }
  26. }
  27. int a = dem.getAlphaMask() / 2;
  28. int r = dem.getRed(pixels[i]) - int_inc;
  29. if (r < 0) {
  30. r = 0;
  31. }
  32. int g = dem.getGreen(pixels[i]) - int_inc;
  33. if (g < 0) {
  34. g = 0;
  35. }
  36. int b = dem.getBlue(pixels[i]) - int_inc;
  37. if (b < 0) {
  38. b = 0;
  39. }
  40. pixels[i] = a << 24 | r << 16 | g << 8 | b;
  41. }
  42. return pixels;
  43. }

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

    1. public final BufferedImage getGradualImg(BufferedImage originalPic) {
    2. // 设置渐变的开发位置,1为中间位置,小于1开始位置偏上,大于1开始位置偏下。
    3. float beginPart = 1f;
    4. // 得到图片的所有渐变后的像素点。
    5. int[] pixels = darkerPixels(originalPic, beginPart);
    6. int imageWidth = originalPic.getWidth();
    7. int imageHeight = originalPic.getHeight();
    8. MemoryImageSource memoryimagesource = new MemoryImageSource(imageWidth,
    9. imageHeight, new DirectColorModel(24, 0xff0000, 0x00ff00,
    10. 0x0000ff), pixels, 0, imageWidth);
    11. Image imageBuf = null;
    12. try {
    13. memoryimagesource.setAnimated(true);
    14. memoryimagesource.setFullBufferUpdates(true);
    15. imageBuf = this.createImage(memoryimagesource);
    16. // 生成新的图像
    17. memoryimagesource.newPixels();
    18. } catch (NoSuchMethodError e) {
    19. e.printStackTrace();
    20. }
    21. BufferedImage changedImage = new BufferedImage(imageWidth, imageHeight,
    22. BufferedImage.TYPE_3BYTE_BGR);
    23. Graphics2D g2d = changedImage.createGraphics();
    24. g2d.drawImage(imageBuf, 0, 0, this);
    25. return changedImage;
    26. }

Java图像渐变的更多相关文章

  1. 以小时候玩的贪吃蛇为例,对于Java图像界面的学习感悟

    简介 正文 01.JFrame是啥? 02.JPanel 03. KeyListener 04.Runnable 05.游戏Running 06.游戏初始类编写 07.main 简介: 一直以来用代码 ...

  2. ps图像渐变

    整理自:http://zhidao.baidu.com/question/16374167.html 1.用ps打开图片 2.在切换至英文输入法状态下(下面的操作均如此)按q 快捷键q的作用是切换标准 ...

  3. Java图像灰度化的实现过程解析

    概要 本文主要介绍了灰度化的几种方法,以及如何使用Java实现灰度化.同时分析了网上一种常见却并不妥当的Java灰度化实现,以及证明了opencv的灰度化是使用“加权灰度化”法 24位彩色图与8位灰度 ...

  4. JAVA 图像操作辅助类

    package util; import java.awt.Component; import java.awt.Image; import java.awt.MediaTracker; import ...

  5. JAVA图像缩放处理

    http://www.blogjava.net/kinkding/archive/2009/05/23/277552.html ———————————————————————————————————— ...

  6. java 图像灰度化与二值化

    转载:http://www.chinasb.org/archives/2013/01/5053.shtml 1: package org.chinasb.client; 2: 3: import ja ...

  7. java图像加密

    0 前言 为了保护服务器的图像数据,需要用一个图像加密算法来加密服务器的图像:一开始找了一种基于混沌的图像加密算法,效果还是很理想的,是把矩阵图像上的像素点进行上下左右的混乱:后来发现加密后图像会变大 ...

  8. <JAVA图像学习笔记>十字路口交通模拟--操作系统模拟课后小项目

    项目的要求很简单: 模拟出十字路口的交通控制情况: 秒. 当东西(或南北)方向红灯时,所有车辆(除了消防车.救护车.警车)均排队等待,当东西(或南北)方向绿灯时,所有车辆按序行驶(不准超车). 制作这 ...

  9. <JAVA图像学习笔记>关于Graphics/Graphics2D以及简单的几何图像制作(一个简单钟表的实现)

    题外话:正好赶上OperatingSystem的作业要做一个模拟线程/进程调度的问题,决定用JAVA实现才发现这些内容和之前学过的GUI制作是两码事儿- -b 通过学习java.swing库的Acti ...

随机推荐

  1. String build-in function - len

    len is a build-in function that returns the numbers of characters in a string: Since we started coun ...

  2. webi和universe

    Universe是一个包含以下内容的文件: 1 一个或多个数据库中间件的连接参数. 2 称为对象的SQL结构,映射到数据库中的实际SQL结构,如列,表和数据库函数.其中对象是按类分组的.用户既可以看到 ...

  3. List<List<model>>如何更快捷的取里面的model?

    访问接口返回数据类型为List<List<model>>,现在想将其中的model插入数据库,感觉一点点循环有点傻,0.0...,各位有没有其他的方法? List<Lis ...

  4. 第一性原理:First principle thinking是什么?

    作者:沧海桑田链接:https://www.zhihu.com/question/40550274/answer/225236964来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  5. mac本 maven项目还没发布成功,tomcat就报没有监听ContextLoaderListener 的解决方法

    Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL     严重: Error config ...

  6. JS文字特效:彩色滚动变幻效果,只适合少量的文字。(过多对页面有影响)

    JS代码如下: 代码具体是在哪里的我不知道但是我的有道云上有.如有哪位朋友知道,还望联系下,添加出处. <div id="chakhsu"></div> & ...

  7. VUE框架学习——脚手架的搭建

    #我的VUE框架学习 题记:初识VUE,觉得VUE十分的不错,故决定去深入的了解学习它,工欲善其事,必先利其器,下面是我搭建vue环境的过程! #一.项目搭建及初始化 1.安装:node.js:去官网 ...

  8. 软raid 实验

    RAID0 条带卷 2+ 100% 读写速度快,不容错 RAID1 镜像卷 2 50% 读写速度一般,容错 RAID5 带奇偶校验的条带卷 3+ (n-1)/n 读写速度快,容错,允许坏一块盘 RAI ...

  9. C# 从需要登录的网站上抓取数据

    [转] C# 从需要登录的网站上抓取数据 背景:昨天一个学金融的同学让我帮她从一个网站上抓取数据,然后导出到excel,粗略看了下有1000+条记录,人工统计的话确实不可能.虽说不会,但作为一个学计算 ...

  10. Android输入法扩展之远程输入法

    近年来,互联网电视開始火热,乐视TV,小米TV,近期爱奇艺也在大肆的招人做爱奇艺电视.当然还有更被关注的苹果电视.事实上,这个趋势非常正常,也非常合理,传统单纯的接收电视节目的电视已经太传统了.是该被 ...