处理色调变化的图像的最佳方法是什么?



我在 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 版本。然后将输出图像中的每个像素设置为该值。

相关内容

最新更新