gpt4 book ai didi

java - 每次我在图像上运行混合方法时,结果都会变得越来越饱和。我该如何解决?

转载 作者:行者123 更新时间:2023-11-30 06:58:17 27 4
gpt4 key购买 nike

我正在使用一种方法,该方法获取图像并将其每个像素与给定颜色混合。我的问题是,每次我使用相同的图像运行该方法时,结果都越来越饱和。像这样: example

我将该方法返回的图像存储为与原始图像不同的变量,并且每次都将原始图像作为 image 参数传递。

这是我正在使用的混合方法:

public static BufferedImage blendImage (BufferedImage image, Color blend) {
BufferedImage newImage = image;

for (int i = 0; i < image.getWidth(); i ++) for (int j = 0; j < image.getHeight(); j ++) {
Color c1 = new Color(image.getRGB(i, j), true);
Color c2 = blend;

float r1 = ((float)c1.getRed()) / 255.0F;
float g1 = ((float)c1.getGreen()) / 255.0F;
float b1 = ((float)c1.getBlue()) / 255.0F;
float a1 = ((float)c1.getAlpha()) / 255.0F;

float r2 = ((float)c2.getRed()) / 255.0F;
float g2 = ((float)c2.getGreen()) / 255.0F;
float b2 = ((float)c2.getBlue()) / 255.0F;
float a2 = ((float)c2.getAlpha()) / 255.0F;

Color c3 = new Color(r1 * r2, g1 * g2, b1 * b2, a1 * a2);

newImage.setRGB(i, j, c3.getRGB());
}

return newImage;
}

我想知道是否可以解决这个问题,或者是否有更好的方法来混合任何人都知道的图像。

编辑:事实证明该方法正在更改原始图像。我不知道如何,但它与 BufferedImage newImage = image; 行有关。我的解决方案是将 newImage 设置为新的 BufferedImage 对象,并使其宽度、高度和类型与传递的 image 相同。我不知道为什么要修改原始图像。

最佳答案

更准确的说法是您的图像越来越暗。

这就是发生的事情。对于每个 channel ,您将图像和混合颜色的值标准化为 0..1 范围,然后将它们相乘。由于两个数字的最大值均为 1,因此输出值永远不会大于它们中的任何一个,并且可能会更小。如果您反复混合某种非纯白色 (255,255,255) 的颜色,即使混合颜色是明亮的颜色,图像也会逐渐变暗。

也许尝试对 channel 值求平均值而不是相乘。

或者只是在整个图像上绘制一个混合颜色的矩形,不透明度为 50%。

关于java - 每次我在图像上运行混合方法时,结果都会变得越来越饱和。我该如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41404954/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com