Java: como fazer uma cópia rápida dos pixels de um BufferedImage? (teste de unidade incluído)

Quero fazer uma cópia (de uma área retangular) dos valores ARGB de uma fonteBufferedImage em um destinoBufferedImage. Nenhuma composição deve ser feita: se eu copiar um pixel com um valor ARGB de 0x8000BE50 (valor alfa em 128), o pixel de destino deverá serexatamente 0x8000BE50, substituindo totalmente o pixel de destino.

Eu tenho uma pergunta muito precisa e fiz um teste de unidade para mostrar o que eu preciso. O teste de unidade é totalmente funcional e independente, está passando bem e está fazendo exatamente o que eu quero.

No entanto, eu quero ummais rápido e mais eficiente em memória método para substituircopySrcIntoDstAt(...)

Esse é o ponto principal da minha pergunta: não estou procurando como "preencher" a imagem de maneira mais rápida (o que fiz foi apenas um exemplo para fazer um teste de unidade). Tudo o que eu quero é saber o que seria umrápido e eficiente em memória maneira de fazer isso (ou seja, rápido e sem criar objetos desnecessários).

A implementação de prova de conceito que fiz é obviamente muito eficiente em termos de memória, mas é lenta (fazer umagetRGB e umsetRGB para cada pixel).

Esquematicamente, eu tenho o seguinte: (onde A indica pixels correspondentes da imagem de destino antes da cópia)

AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA

E eu quero ter isso:

AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAABBBBAAA
AAAAAAAAAAAAABBBBAAA
AAAAAAAAAAAAAAAAAAAA

onde 'B' representa os pixels dasrc imagem.

Observe que estou procurando uma substituição exata docopySrcIntoDstAt (...) , não para um link / cotação da 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 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 );
            }
        }
    }

}

questionAnswers(1)

yourAnswerToTheQuestion