您的位置:首页 > 编程语言 > Java开发

Java图像渐变

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

原始图片:



图像变暗渐变:



图像变暗渐变:



图像变亮渐变:



图像变亮渐变:



我们以图像渐变暗举例,渐变亮同样的道理,无非是一个减,一个加。

1.我们要先拿到图片,这个不赘述了,就是获得图像的BufferedImage。

2.获得图像的宽度,高度,像素值,并创建一个存储图像像素信息DirectColorModel类dem。然后我们从dem中每一个像素值。我们给每一个像素都减去一个相同的像素值。并且伴随着图片的高度不同,每个像素点减去的值也是一个渐变的值。这里需要说明一下的是float

beginPart,beginPart是渐变开始的位置,默认为1,就是从图像中间开始,beginPart<1从图像的中间偏上开始渐变,越小越偏上。beginPart>1从图像的中间偏下开始渐变,越大越偏上。

代码如下:

[java] view plain copy

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] view plain copy

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: