我在 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;
}
所以,我的问题是:
为了- 显示具有不断变化的色调的图像,标准,普遍接受或最佳方法是什么?
- 使用我尺寸的图像这样做是否合理?
另外,我怀疑这是否重要,但色调随着时间的推移呈线性变化,并在溢出后回变为零。基本上,它会循环遍历所有颜色,然后重复。
虽然你的问题不是很具体,但我会指出你的代码中的一些缺陷。如果您修复了这些问题,您应该会看到速度的合理提高。
您有一个函数,该函数将缓冲图像和色相值作为输入。
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 颜色。
然后,从输入图像中读取像素,更改其颜色,然后将该颜色设置为输出图像中的像素。
此功能所做的只是用某种色调填充图像。
- 您在不使用其信息的情况下读取宽度*高度像素。
- 您计算RBG颜色宽度*高度乘以,尽管它是一样的 对于每个像素
- 您读到颜色 RGB 值 3 * 高度 * 宽度乘以
- 将这些值分配 3 * 高度 * 宽度乘以。
您需要做的就是在循环之外计算单个 RGB 版本。然后将输出图像中的每个像素设置为该值。