Como converter um byte [] para um BufferedImage em Java?

Estou postando este tópico porque tenho algumas dificuldades para lidar com imagens em Java. Eu gostaria de poder converter uma imagem em um array byte [] e, em seguida, ser capaz de fazer a operação inversa, para que eu possa alterar o RGB de cada pixel e, em seguida, fazer uma nova imagem. Eu quero usar essa solução porque setRGB () e getRGB () de BufferedImage pode ser muito lento para imagens enormes (me corrija se eu estiver errado).

Eu li alguns posts aqui para obter uma matriz byte [] (como aqui) para que cada pixel seja representado por 3 ou 4 células da matriz contendo os valores vermelho, verde e azul (com o valor alfa adicional, quando houver 4 células), o que é bastante útil e fácil de usar para mim. Aqui está o código que eu uso para obter este array (armazenado em uma classe PixelArray que eu criei):

public PixelArray(BufferedImage image)
{
    width = image.getWidth();
    height = image.getHeight();
    DataBuffer toArray = image.getRaster().getDataBuffer();
    array = ((DataBufferByte) toArray).getData();
    hasAlphaChannel = image.getAlphaRaster() != null;
}

Meu grande problema é que eu não encontrei nenhum método eficiente para converter este array byte [] para uma nova imagem, se eu quisesse transformar a imagem (por exemplo, remover os valores azul / verde e manter apenas o vermelho). Eu tentei essas soluções:

1) Criando um objeto DataBuffer, então faça um SampleModel, para finalmente criar um WritableRaster e depois BufferedImage (com objetos ColorModel e Hashtable adicionais). Não funcionou porque aparentemente não tenho todas as informações de que preciso (não tenho idéia do que é o construtor Hashtable for BufferedImage ()).

2) Usando um ByteArrayInputStream. Isso não funcionou porque o array byte [] esperado com ByteArrayInputStream não tem nada a ver com o meu: ele representa cada byte do arquivo, e não cada componente de cada pixel (com 3-4 bytes para cada pixel) ...

Alguém poderia me ajudar?

questionAnswers(5)

yourAnswerToTheQuestion