Qual é a maneira mais eficiente de criar um ImageIcon em escala reduzida a partir de pixels do tipo byte []?

Estou mantendo os pixels da imagem em uma matriz de bytes usando esta instrução:

bytePixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();

Agora eu preciso construir uma versão reduzida da imagem e colocá-la em um ImageIcon usando essa matriz de bytes. Observe que a imagem original pode ser enorme, então construa uma nova BufferedImage como esta:

public Icon getImageIcon(int newWidth, int newHeight) throws IOException {
  BufferedImage image = ImageIO.read(originalImageFile);
  BufferedImage resizedImage = new BufferedImage(newWidth, newHeight, this.getType());
  Graphics2D g = resizedImage.createGraphics();
  g.drawImage(image, 0, 0, newWidth, newHeight, null);
  g.dispose();

  return new ImageIcon(resizedImage);
}

não é uma opção, porque provavelmente causará um OutOfMemoryError se a imagem original for grande.

Portanto, minha pergunta é: usando os pixels originais na matriz de bytes, qual é a maneira mais eficiente (em termos de memória) de obter um ImageIcon com tamanho menor?

Resposta 1

Erro OutOfMemory, isso é estranho. O tamanho padrão do heap da JVM é bastante grande. Provavelmente, tem mais de 100 MB. Uma imagem em buffer, 4 bytes por pixel de 100 MB seria:

100 000 000 = x * 4 bytes
          x = 25 000 000 pixels

Isso significa que você está usando uma imagem de quase 5000 * 5000 pixels. Tente aumentar o tamanho máximo do heap usando este argumento de linha de comando:

java -XmX400M YourClass

Além disso, eu não armazenaria os pixels usando uma matriz de bytes. Mas, simplesmente como BufferedImage, dessa forma, você tem certeza de que os dados da imagem não estão duas vezes na memória.

Resposta: 2

Estou tentando testar uma gramática ANTLR com uma plataforma de teste padrão import org.antlr.runtime. *; classe Main {public static void main (String [] args) lança Exception {SampleLexer lexer = new ...

Sei que essa pergunta já foi feita antes, possivelmente várias vezes, mas nenhuma das respostas ajudou meu problema. O problema que estou tendo é que, depois de seguir as instruções de instalação aqui, ...

Estou gerando alguns JComponents no código e usando o layout GridBag para organizá-los. Meu layout consiste em 12 linhas e 3 colunas, com cada linha consistindo em um JSlider, um JCheckBox e um JLabel. Aqui'...

Qual é o preço da chamada size () na lista ou no mapa em Java? ou é melhor salvar o valor de size () em uma variável se acessado com frequência?