改变色调的图像的最佳方法是什么?

时间:2017-07-01 10:36:56

标签: java performance image-processing bufferedimage

我在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;
}

所以,我的问题是:

  • 显示色彩不断变化的图像的标准,普遍接受或最佳方式是什么?
  • 使用我的尺寸图像这样做是否合理?

另外,我怀疑它是否重要,但色调随着时间的推移呈线性变化,并在溢出后回复到零。基本上它循环遍历所有颜色,然后重复。

1 个答案:

答案 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颜色。

然后,您从输入图像中读取一个像素,更改其颜色,然后将该颜色设置为输出图像中的一个像素。

所有这个功能都是用一定的色调填充图像。

  • 您在不使用其信息的情况下读取宽度*高度像素。
  • 你计算一个RBG颜色宽度*高度的时间,但它是相同的 对于每个像素
  • 您读取的颜色为RGB值3 * height * width times
  • 您可以为这些值指定3 * height * width times。

您需要做的就是在循环外计算一个RGB touple。然后将输出图像中的每个像素设置为该值。