Java图像渐变

图像渐变我们大体想一下思路无非是这样:将图像所有的像素点的RBG,每个点就减去相同的量,而且这个量是个渐变的量。是的,就是这样,我们的程序也是这个思路,不过就是没有单纯的“想”这么简单了。我这里只编写了纵向渐变,还没有写其他复杂的渐变,以后慢慢研究吧。先看效果:
原始图片:
[img]http://www.kutoku.info/images/java/100813/0.png[/img]
图像变暗渐变:
[img]http://www.kutoku.info/images/java/100813/1.png[/img]
图像变暗渐变:
[img]http://www.kutoku.info/images/java/100813/2.png[/img]
图像变亮渐变:
[img]http://www.kutoku.info/images/java/100813/3.png[/img]
图像变亮渐变:
[img]http://www.kutoku.info/images/java/100813/4.png[/img]

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

附件是一个完整的例子,运行时,请将文件夹根目录下的demo.jpg复制到C盘根目录下,因为这个路径我在程序里偷懒是写死的,如果不复制这个图片,找不到图片程序自然会出IO异常;或者大家自己去程序里修改图片的路径。

文章地址:[url]http://javapub.iteye.com/blog/736799[/url]

相关文章
[b]Java图像图片 边缘检测[/b] [url]http://javapub.iteye.com/blog/685468[/url]
[b]Java图像变灰[/b] [url]http://javapub.iteye.com/blog/687082[/url]
[b]Java 给图片增加 水印图片 水印文字[/b] [url]Java 给图片增加 水印图片 水印文字[/url]
[b]Java图像渐变[/b] [url]http://javapub.iteye.com/blog/736799[/url]
[b]Java将大图片转成小图片[/b] [url]http://javapub.iteye.com/blog/666607[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值