如何解决处理像素数据时如何淡出BufferedImage?
我正在尝试做以前从未做过的事情。 我的目标是能够操纵BufferedImage的不透明度。首先,我不使用图形。我正在开发一个简单的游戏引擎,并且仅使用BufferedImages中的像素数据。
我尝试了什么?
我制作了自己的“ Image”类,该类接受BufferedImage。
BufferedImage image = null;
try {
image = ImageIO.read(Image.class.getResourceAsStream(resourcePath));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
width = image.getWidth();
height = image.getHeight();
hasAlpha = image.getColorModel().hasAlpha();
pixels = image.getRGB(0,width,height,null,width);
之后,我继续进行渲染代码。我有一个名为“ drawImage()”的函数,它可以获取图像及其数据,然后根据用户的意愿将其放在屏幕上的特定位置。但是,我希望用户也选择它的不透明度。
我从获取该像素的像素数据开始,而是制作了颜色。
Color c = new Color(image.getPixels()[value2],true);
据我所知,“ true”声明表示它应该“关心” Alpha。
之后,我使用以下代码放置像素:
pixels[x + y * pWidth] = new Color(c.getRed(),c.getGreen(),c.getBlue(),alphaValue).getRGB();
这不起作用。它不会输出任何错误,我可以将alphaValue更改为0到无穷大之间的数字。但是,我发现的一个问题是,当我将alpha从255更改为50时,它根本不影响图像。它保持不变。影响在0-5。我注意到的另一件事是,当我将alphaValue设置为2时,我得到的是动画而不是透明度较低的图像。听起来很奇怪,这就是为什么我提供了该问题的.GIF:
我向您保证没有代码可以更改alphaValue。在“动画”期间,将其设置为2,并且没有其他设置。
所以这里有些奇怪,我想知道你们是否知道这个问题吗?
它可能与Image类有关,并且我没有将其设置为 BufferedImage.RGBA ,但是我不知道在加载图像时该怎么做? / p>
如果您需要更多信息,请发表评论,我将提供更多信息!
谢谢!
编辑 我通过操纵背景像素(也是bufferedImage)每1/60秒清除一次屏幕:
public void clear() {
for(int i = 0; i < pixels.length; i++) {
pixels[i] = clearColor.getRGB();
}
}
可能的问题
我进行了一些故障排除,然后发现@Joni所说的每帧实际上在某种程度上增加了不透明度。不透明或Alpha似乎以某种方式增加了每一帧,但我正在清除图纸之间的屏幕。我将进一步排除故障。
更新
我这样做是为了移动图像并发现这种奇怪的行为:
似乎“ alpha”没有重置。我知道RGB正在重置,但是在Alpha上确实有些问题。
我将清除功能更改为:
public void clear() {
for(int i = 0; i < pixels.length; i++) {
pixels[i] = new Color(clearColor.getRed(),clearColor.getGreen(),clearColor.getBlue(),255).getRGB();
}
}
我将clearColor定义为:
Color clearColor = new Color(Color.black.getRGB(),true);
但是那也不起作用。有人有解决方案吗?
解决方法
您的游戏引擎正在循环绘制图像。多次绘制后,效果与完全不使用透明度相同。阿尔法越低,花费的时间就越长:使用50%的阿尔法,您需要7帧才能获得99%的不透明度;使用5%的alpha,则需要大约90帧。
例如,假设您在屏幕上绘制的像素值为100,该屏幕的初始值为0(黑色),不透明度为50%。在第一帧之后,输出像素值为.5 * 100 + .5 * 0 =50。第二帧绘制在第一帧的顶部,因此输出像素值为.5 * 100 + .5 * 50 = 75.在第二帧上方绘制的第三帧将显示.5 * 100 + .5 * 75 = 87.5。
为避免这种情况,您需要在每帧图像的下方填充纯色背景颜色。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。