Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在操作BuffereImage时使其褪色';像素数据?_Java_Alpha - Fatal编程技术网

Java 如何在操作BuffereImage时使其褪色';像素数据?

Java 如何在操作BuffereImage时使其褪色';像素数据?,java,alpha,Java,Alpha,我正在尝试做一些我以前从未做过的事情。 我的目标是能够操纵BuffereImage的不透明度。首先,我不使用图形。我正在开发一个简单的游戏引擎,我只使用来自BuffereImage的像素数据 我试过什么? 我创建了自己的“Image”类,它接收一个buffereImage BufferedImage image = null; try { image = ImageIO.read(Image.class.getResourceAsStream(resourcePath))

我正在尝试做一些我以前从未做过的事情。 我的目标是能够操纵BuffereImage的不透明度。首先,我不使用图形。我正在开发一个简单的游戏引擎,我只使用来自BuffereImage的像素数据

我试过什么?

我创建了自己的“Image”类,它接收一个buffereImage

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, 0, width, height,null,0,width);
之后,我继续我的渲染代码。我有一个名为“drawImage()”的函数,它获取图像及其数据,然后根据用户的意愿将其放在屏幕上的特定位置。但是,我希望用户选择它的不透明以及

我一开始是用像素数据来表示那个像素,然后我做了一个颜色

Color c = new Color(image.getPixels()[value2],true);
据我所知,“真实”的说法是,它应该“关心”阿尔法

之后,我使用以下代码放置像素:

pixels[x + y * pWidth] = new Color(c.getRed(),c.getGreen(),c.getBlue(),alphaValue).getRGB();
这不管用。它不会输出任何错误,我可以将alphaValue更改为0到无穷大之间的数字。然而,我发现的一个问题是,当我将alpha值从255更改为50左右时,它根本不会影响图像。它保持不变。影响值为0-5。我注意到的另一件事是,当我将alphaValue设置为2时,我得到的是一个动画,而不是不透明度较低的图像。听起来很奇怪,这就是为什么我提供了该问题的.GIF文件:

我向您保证,没有任何代码可以更改字母值。在该“动画”过程中,它被设置为2,而没有其他设置

所以这里有些奇怪,我想知道你们是否知道这个问题

它可能与Image类有关,并且我没有将其设置为BuffereImage.RGBA,但我不知道在加载图像时如何才能这样做

如果你需要更多信息,请留下评论,我会提供更多信息

提前谢谢

编辑 我通过操纵背景像素(也是一个缓冲图像),每1/60秒清除一次屏幕:


然而,这也不起作用。有人有解决方案吗?

您的游戏引擎正在将图像以循环方式绘制在自身的顶部。绘制足够多次后,效果与根本没有使用透明度相同。alpha越低,所需时间越长:使用50%alpha时,需要7帧才能获得99%的不透明度,使用5%alpha时,需要大约90帧

例如,假设您正在一个初始为0(黑色)且不透明度为50%的屏幕上绘制100的像素值。在第一帧之后,输出像素值为.5*100+.5*0=50。第二帧绘制在第一帧的顶部,因此输出像素值为.5*100+.5*50=75。在第二帧顶部绘制的第三帧将显示.5*100+.5*75=87.5


为了避免这种情况,您需要在每一帧的图像下填充一种纯色背景。

我将“透明色”更改为color.white,但没有任何区别。我不太明白你在说什么。当我将alpha设置为2并且不更改它时,不透明度如何提高到99%呢?如何用相同的alpha渲染相同的图像,使其达到99%的不透明度?我每1/60秒更新一次帧。因此,将删除旧图像并渲染新图像。我应该提到这一点。旧图像在哪里被删除?你的代码没有显示这一点。这不是因为我想让问题简单化。一个清晰的函数将所有背景(也是一个BuffereImage)像素设置为一种特定的颜色,这让它显得过于夸张。我用一个显示代码的编辑更新了我的问题。该死,如果是android,我有一个很好的答案。缩小图像比例并将其绘制成更大的尺寸也会产生模糊效果。
public void clear() {
    for(int i = 0; i < pixels.length; i++) {
        pixels[i] = clearColor.getRGB();
    }
    
    
}
public void clear() {
    for(int i = 0; i < pixels.length; i++) {
        pixels[i] = new Color(clearColor.getRed(),clearColor.getGreen(),clearColor.getBlue(),255).getRGB();
    }
    
    
}
Color clearColor = new Color(Color.black.getRGB(),true);