【问题标题】:What is the best approach to images with changing hue?改变色调的图像的最佳方法是什么?
【发布时间】:2017-07-01 10:36:56
【问题描述】:

我在 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) 不要要求“最好”的东西。 best 什么都不说,对每个人都有不同的意义。 2)如果您想要快速的东西,您需要指定“每秒多次”的含义以及您正在运行软件的机器......
  • @Piglet 谢谢,我以后会尝试这样做。

标签: java performance image-processing bufferedimage


【解决方案1】:

虽然您的问题不是很具体,但我会指出您的代码中的一些缺陷。如果您解决了这些问题,您应该会看到速度的合理改进。

您有一个将 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 * 高度 * 宽度时间
  • 您将这些值指定为 3 * 高度 * 宽度的时间。

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

【讨论】:

    猜你喜欢
    • 2016-01-13
    • 1970-01-01
    • 2011-03-15
    • 2013-05-23
    • 2012-02-25
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多