我在Java中有一个完全去饱和的BufferedImage
我需要每秒多次显示到JFrame,但是,在渲染之前,图像需要以某种色调饱和。我面临的问题是,我不知道任何一种性能足够快的方法,能够在色调改变每帧时提供平滑的帧速率。
我尝试在渲染过程中生成具有所需色调值的图像,但除非图像非常小,否则会产生较慢的帧速率。我还试图缓存一堆饱和图像,并为每个帧选择一个,但只有256个缓存图像,它会产生很长的加载时间。
图片的大小可能只有1000x500
像素。
我目前重新着色图像的代码如下:
private BufferedImage recolored(BufferedImage image, float hue) {
int width = image.getWidth();
int height = image.getHeight();
WritableRaster raster = image.getRaster();
BufferedImage res = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
WritableRaster resRast = res.getRaster();
for (int xx = 0; xx < width; xx++) {
for (int yy = 0; yy < height; yy++) {
Color color = new Color(Color.HSBtoRGB(hue, 0.7f, 0.7f));
int[] pixels = raster.getPixel(xx, yy, (int[]) null);
pixels[0] = color.getRed();
pixels[1] = color.getGreen();
pixels[2] = color.getBlue();
resRast.setPixel(xx, yy, pixels);
}
}
return res;
}
所以,我的问题是:
另外,我怀疑它是否重要,但色调随着时间的推移呈线性变化,并在溢出后回复到零。基本上它循环遍历所有颜色,然后重复。
答案 0 :(得分:0)
虽然你的问题不是很具体,但我会在你的代码中指出一些缺陷。如果你解决了这些问题,你应该看到合理的速度提升。
你有一个函数,它将BufferedImage和Hue值作为输入。
for (int xx = 0; xx < width; xx++) {
for (int yy = 0; yy < height; yy++) {
Color color = new Color(Color.HSBtoRGB(hue, 0.7f, 0.7f));
int[] pixels = raster.getPixel(xx, yy, (int[]) null);
pixels[0] = color.getRed();
pixels[1] = color.getGreen();
pixels[2] = color.getBlue();
resRast.setPixel(xx, yy, pixels);
}
}
在此嵌套循环中,您将迭代图像中的每个像素。对于图像中的每个坐标,您可以根据提供的色调值计算rgb颜色。
然后,您从输入图像中读取一个像素,更改其颜色,然后将该颜色设置为输出图像中的一个像素。
所有这个功能都是用一定的色调填充图像。
您需要做的就是在循环外计算一个RGB touple。然后将输出图像中的每个像素设置为该值。