相关疑难解决方法(0)

Java:如何快速复制BufferedImage的像素?(包括单元测试)

我想从源BufferedImage到目的地复制(矩形区域)ARGB值BufferedImage.不应该进行合成:如果我复制ARGB值为0x8000BE50(alpha值为128)的像素,则目标像素必须精确为 0x8000BE50,完全覆盖目标像素.

我有一个非常精确的问题,我做了一个单元测试来展示我需要的东西.单元测试功能齐全,设备齐全,传递良好,正是我想要的.

但是,我想要一种更快,更有效的内存方法来替换copySrcIntoDstAt(...).

这就是我的问题的全部要点:我不是在追求如何以更快的方式"填充"图像(我所做的仅仅是进行单元测试的一个例子).我想要的只是知道什么是快速和内存有效的方法(即快速而不是创建不必要的对象).

我所做的概念验证实现显然非常节省内存,但速度很慢(每个像素执行一次getRGB和一次setRGB).

原理上,我有这样的:(其中A表示复制前目标图像的相应像素)

AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
Run Code Online (Sandbox Code Playgroud)

我希望有这个:

AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAABBBBAAA
AAAAAAAAAAAAABBBBAAA
AAAAAAAAAAAAAAAAAAAA
Run Code Online (Sandbox Code Playgroud)

其中'B'代表src图像中的像素.

请注意,我正在寻找copySrcIntoDstAt(...)方法的完全替代,而不是API链接/引用.

import org.junit.Test;

import java.awt.image.BufferedImage;

import static org.junit.Assert.*;

public class TestCopy {

    private static final int COL1 = 0x8000BE50;  // alpha at 128
    private static final int COL2 = 0x1732FE87;  // alpha at  23 

    @Test
    public void testPixelsCopy() {
        final …
Run Code Online (Sandbox Code Playgroud)

java bufferedimage

18
推荐指数
1
解决办法
1万
查看次数

将 BufferedImage 的像素设置为透明

如何快速有效地将 a 的所有像素设置BufferedImage为透明,以便我可以简单地为每一帧重新绘制我想要的精灵图形?

我正在用 Java 设计一个简单的游戏引擎,它更新背景和前景BufferedImage并将它们绘制到一个复合体VolatileImage以进行有效缩放,然后绘制到JPanel. 这个可扩展的模型允许我添加更多层并迭代每个绘图层。

我将我的应用程序简化为下面给出的一类来演示我的问题。使用箭头键在图像上移动一个红色方块。挑战是我想将更新游戏图形与将复合图形绘制到游戏引擎中分离。我已经研究了这个问题看似彻底的答案,但无法弄清楚如何将它们应用于我的应用程序:

这是未正确清除像素的关键部分。注释掉的部分来自我已经阅读过的堆栈溢出答案,但它们将背景绘制为不透明的黑色或白色。我知道foregroundImage在我的实现中以透明像素开始,因为您可以backgroundImage在应用程序启动时看到红色精灵背后的随机像素噪声。现在,图像没有被清除,所以之前绘制的图像仍然存在。

/** Update the foregroundGraphics. */
private void updateGraphics(){
    Graphics2D fgGraphics = (Graphics2D) foregroundImage.getGraphics(); 

    // set image pixels to transparent
    //fgGraphics.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR));
    //fgGraphics.setColor(new Color(0,0,0,0));
    //fgGraphics.clearRect(0, 0, width, height);
    //fgGraphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

    // draw again.
    fgGraphics.setColor(Color.RED);
    fgGraphics.fillRect(sx, sy, spriteSize, spriteSize);
    fgGraphics.dispose();
}
Run Code Online (Sandbox Code Playgroud)

这是我的整个示例代码:

/**
 * The goal is to draw two BufferedImages quickly onto a scalable JPanel, using 
 * a VolatileImage as …
Run Code Online (Sandbox Code Playgroud)

java swing bufferedimage alpha game-engine

3
推荐指数
1
解决办法
1349
查看次数

标签 统计

bufferedimage ×2

java ×2

alpha ×1

game-engine ×1

swing ×1