[图像处理] Java图像渐变
javapub
2010-08-13
图像渐变我们大体想一下思路无非是这样:将图像所有的像素点的RBG,每个点就减去相同的量,而且这个量是个渐变的量。是的,就是这样,我们的程序也是这个思路,不过就是没有单纯的“想”这么简单了。我这里只编写了纵向渐变,还没有写其他复杂的渐变,以后慢慢研究吧。先看效果:
原始图片: 图像变暗渐变: 图像变暗渐变: 图像变亮渐变: 图像变亮渐变: 我们以图像渐变暗举例,渐变亮同样的道理,无非是一个减,一个加。 1.我们要先拿到图片,这个不赘述了,就是获得图像的BufferedImage。 2.获得图像的宽度,高度,像素值,并创建一个存储图像像素信息DirectColorModel类dem。然后我们从dem中每一个像素值。我们给每一个像素都减去一个相同的像素值。并且伴随着图片的高度不同,每个像素点减去的值也是一个渐变的值。这里需要说明一下的是float beginPart,beginPart是渐变开始的位置,默认为1,就是从图像中间开始,beginPart<1从图像的中间偏上开始渐变,越小越偏上。beginPart>1从图像的中间偏下开始渐变,越大越偏上。 代码如下: 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.利用改变后的像素点,生成一副新的图片。代码如下: public final BufferedImage getGradualImg(BufferedImage originalPic) { // 设置渐变的开发位置,1为中间位置,小于1开始位置偏上,大于1开始位置偏下。 float beginPart = 1f; // 得到图片的所有渐变后的像素点。 int[] pixels = darkerPixels(originalPic, beginPart); int imageWidth = originalPic.getWidth(); int imageHeight = originalPic.getHeight(); MemoryImageSource memoryimagesource = new MemoryImageSource(imageWidth, imageHeight, new DirectColorModel(24, 0xff0000, 0x00ff00, 0x0000ff), pixels, 0, imageWidth); Image imageBuf = null; try { memoryimagesource.setAnimated(true); memoryimagesource.setFullBufferUpdates(true); imageBuf = this.createImage(memoryimagesource); // 生成新的图像 memoryimagesource.newPixels(); } catch (NoSuchMethodError e) { e.printStackTrace(); } BufferedImage changedImage = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_3BYTE_BGR); Graphics2D g2d = changedImage.createGraphics(); g2d.drawImage(imageBuf, 0, 0, this); return changedImage; } 附件是一个完整的例子,运行时,请将文件夹根目录下的demo.jpg复制到C盘根目录下,因为这个路径我在程序里偷懒是写死的,如果不复制这个图片,找不到图片程序自然会出IO异常;或者大家自己去程序里修改图片的路径。 文章地址:http://javapub.iteye.com/blog/736799 相关文章 Java图像图片 边缘检测 http://javapub.iteye.com/blog/685468 Java图像变灰 http://javapub.iteye.com/blog/687082 Java 给图片增加 水印图片 水印文字 [url]Java 给图片增加 水印图片 水印文字[/url] Java图像渐变 http://javapub.iteye.com/blog/736799 Java将大图片转成小图片 http://javapub.iteye.com/blog/666607 |
相关讨论
相关资源推荐
- Hibernate各种查询:联表查询 分页查询 位置参数查询(?) 占位符查询(冒号查询) 统计查询
- jpa中分组统计分页查询
- 91---Criteria的内链接,分页,查询唯一对象,条件查询,分组统计,投影查询,DetachedCriteria
- long mode 分页_用QBC实现统计和分页时候出现了一些问题。
- ElasticSearch在Springboot的导入、分页、统计数量的不同实现
- 35、分页和统计查询
- Hibernate的Criteria查询分页示例
- 【Hibernate】Criteria条件、动态、分页、排序、连接、投影、聚合、分组查询丶离线查询
- spring-mongoDB mongoTemplate排序分组|分页|统计
- Hibernate Criteria分页查询消除重复行