首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java:如何快速复制BufferedImage的像素?(包括单元测试)

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

Stack Overflow用户
提问于 2010-05-13 17:57:18
回答 1查看 12.1K关注 0票数 19

我想将ARGB值从源BufferedImage复制到目标BufferedImage (矩形区域)。不应该做合成:如果我复制一个argb值为0x8000BE50 (alpha值为128)的像素,那么目标像素必须恰好是0x8000BE50,完全覆盖目标像素。

我有一个非常精确的问题,我做了一个单元测试来显示我需要什么。单元测试功能齐全,运行良好,完全符合我的要求。

但是,我想要一个更快、内存更高效的方法来取代copySrcIntoDstAt(...)。

这就是我的问题的重点:我并不是在追求如何以一种更快的方式“填充”图像(我所做的只是一个单元测试的例子)。我所想要的就是知道怎样才是一种既快速又节省内存的方法(即既快又不创建不必要的对象)。

我所做的概念验证实现显然是非常高效的内存,但它很慢(对每个像素执行一个getRGB和一个setRGB )。

从原理上讲,我得到了这样的结果:(其中A表示复制之前来自目标图像的相应像素)

代码语言:javascript
运行
复制
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA

我想要的是:

代码语言:javascript
运行
复制
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAABBBBAAA
AAAAAAAAAAAAABBBBAAA
AAAAAAAAAAAAAAAAAAAA

其中'B‘表示src图像中的像素。

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

代码语言:javascript
运行
复制
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 BufferedImage src = new BufferedImage(  5,  5, BufferedImage.TYPE_INT_ARGB );
        final BufferedImage dst = new BufferedImage( 20, 20, BufferedImage.TYPE_INT_ARGB );
        convenienceFill( src, COL1 );
        convenienceFill( dst, COL2 );
        copySrcIntoDstAt( src, dst, 3, 4 );
        for (int x = 0; x < dst.getWidth(); x++) {
            for (int y = 0; y < dst.getHeight(); y++) {
                if ( x >= 3 && x <= 7 && y >= 4 && y <= 8 ) {
                    assertEquals( COL1, dst.getRGB(x,y) );
                } else {
                    assertEquals( COL2, dst.getRGB(x,y) );
                }
            }
        }
    }

    // clipping is unnecessary
    private static void copySrcIntoDstAt(
            final BufferedImage src,
            final BufferedImage dst,
            final int dx,
            final int dy
    ) {
        // TODO: replace this by a much more efficient method
        for (int x = 0; x < src.getWidth(); x++) {
            for (int y = 0; y < src.getHeight(); y++) {
                dst.setRGB( dx + x, dy + y, src.getRGB(x,y) );
            }
        }
    }

    // This method is just a convenience method, there's
    // no point in optimizing this method, this is not what
    // this question is about
    private static void convenienceFill(
            final BufferedImage bi,
            final int color
    ) {
        for (int x = 0; x < bi.getWidth(); x++) {
            for (int y = 0; y < bi.getHeight(); y++) {
                bi.setRGB( x, y, color );
            }
        }
    }

}
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2825837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档