Java图像渐变
图像渐变我们大体想一下思路无非是这样:将图像所有的像素点的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;
- }
Java图像渐变的更多相关文章
- 以小时候玩的贪吃蛇为例,对于Java图像界面的学习感悟
简介 正文 01.JFrame是啥? 02.JPanel 03. KeyListener 04.Runnable 05.游戏Running 06.游戏初始类编写 07.main 简介: 一直以来用代码 ...
- ps图像渐变
整理自:http://zhidao.baidu.com/question/16374167.html 1.用ps打开图片 2.在切换至英文输入法状态下(下面的操作均如此)按q 快捷键q的作用是切换标准 ...
- Java图像灰度化的实现过程解析
概要 本文主要介绍了灰度化的几种方法,以及如何使用Java实现灰度化.同时分析了网上一种常见却并不妥当的Java灰度化实现,以及证明了opencv的灰度化是使用“加权灰度化”法 24位彩色图与8位灰度 ...
- JAVA 图像操作辅助类
package util; import java.awt.Component; import java.awt.Image; import java.awt.MediaTracker; import ...
- JAVA图像缩放处理
http://www.blogjava.net/kinkding/archive/2009/05/23/277552.html ———————————————————————————————————— ...
- java 图像灰度化与二值化
转载:http://www.chinasb.org/archives/2013/01/5053.shtml 1: package org.chinasb.client; 2: 3: import ja ...
- java图像加密
0 前言 为了保护服务器的图像数据,需要用一个图像加密算法来加密服务器的图像:一开始找了一种基于混沌的图像加密算法,效果还是很理想的,是把矩阵图像上的像素点进行上下左右的混乱:后来发现加密后图像会变大 ...
- <JAVA图像学习笔记>十字路口交通模拟--操作系统模拟课后小项目
项目的要求很简单: 模拟出十字路口的交通控制情况: 秒. 当东西(或南北)方向红灯时,所有车辆(除了消防车.救护车.警车)均排队等待,当东西(或南北)方向绿灯时,所有车辆按序行驶(不准超车). 制作这 ...
- <JAVA图像学习笔记>关于Graphics/Graphics2D以及简单的几何图像制作(一个简单钟表的实现)
题外话:正好赶上OperatingSystem的作业要做一个模拟线程/进程调度的问题,决定用JAVA实现才发现这些内容和之前学过的GUI制作是两码事儿- -b 通过学习java.swing库的Acti ...
随机推荐
- del_archivelog
#!/usr/bin/env bash # # INTRO : The script for delete physical standby app ...
- java反射与多态(父类调用子类)的代码演示
package Test0817; import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method ...
- Python爬虫基础示例
使用pip安装相关依赖: pip install requests pip install bs4 安装成功提示:Successfully installed *... 爬取中国天气网数据示例代码: ...
- 【转载】解决django models文件修改后的数据库同步问题——south模块
转载链接:https://www.cnblogs.com/frchen/p/5732490.html 在使用django进行开发时,往往需要根据不同的需求对model进行更改.而这时候,python ...
- 紫书 例题 10-28 UVa 1393(简化问题)
这道题是对称的 所以只算"\", 最后答案再乘以2 然后每一条直线看作一个包围盒 枚举包围盒的长宽 有两种情况会重复 (1)包围盒里面有包围盒. 这个时候就是在一条直线上 那么我们 ...
- Git学习总结(6)——作为一名程序员这些代码托管工具你都知道吗?
作为一名程序员这些代码托管工具你都知道吗? 作为一名优秀的开发者,大家都会用到代码托管,我本人用的是github,确实github里面有很多很多开源的项目,所以我们目前的创业项目程序员客栈www.pr ...
- ArcGIS api for javascript——加载查询结果,单击显示信息窗口
描述 本例在开始和地图交互前执行一个查询并加载结果.这允许用户点击任意郡县立即看到一个InfoWindow. QueryTask构造函数接受被查询的图层,即ESRI sample server上ESR ...
- Service绑定模式
Service绑定模式 使用绑定的Service能够实现组件与Service的通信. 组件与被绑定的Service能够不归属于同一个应用程序.因此通过绑定Service能够实现进程间通信. ...
- CentOS 中使用yum出现的“UnicodeDecodeError: 'ascii' codec”问题解决方法
问题 新装了CentOS 6.5系统,打算使用yum安装程序是出现了例如以下错误: Loading mirror speeds from cached hostfile Traceback (most ...
- scikit-learn:3.2. Grid Search: Searching for estimator parameters
參考:http://scikit-learn.org/stable/modules/grid_search.html GridSearchCV通过(蛮力)搜索參数空间(參数的全部可能组合).寻找最好的 ...