Criar imagem com ByteArrayInputStream

5 respostas
F

Olá,pessoal. Estou tendo um problema para criar uma imagem a partir de uma matriz. A forma que encontrei que aparenta ser mais simples é a que estou usando no código abaixo. Entretanto a imagem sempre fica null. O retorno do método 'vetorToBufferedImage' sempre dá null. Alguem consegue ver algum problema? Já testei a matriz e está passando os valores corretos,o problema é quando uso o 'ByteArrayInputStream'. Grato.

public byte[] matrizToVetor(double[][] matriz) {
        int i, j;
        int w = matriz.length;
        int h = matriz[0].length;
        int tamanhoVetor = w*h;
        
        byte[] vetor = new byte[tamanhoVetor];
        
        tamanhoVetor = 0;
        for (i = 0; i < w; i++)
        {
            for (j = 0; j < h; j++)
            {
                vetor[tamanhoVetor] = (byte)matriz[i][j];
                tamanhoVetor++;
            }
        }
        return vetor;
    }
    
    public BufferedImage vetorToBufferedImage(double[][] matrizImagem) {
        byte[] vetorImagem = matrizToVetor(matrizImagem);
        ByteArrayInputStream vetorImput = new ByteArrayInputStream(vetorImagem);
       
        try {
            return ImageIO.read(vetorImput);
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

5 Respostas

fabiocortolan

Onde vc está fazendo a chamada ao método “vetorToBufferedImage()”?

F

Em uma outra classe que passa uma matriz numérica.

A chamada tah assim:

BufferedImage imagemAUX = objetoConverter.vetorToBufferedImage(matrizProcessada);
fabiocortolan

[quote=FelipeMonte]
Em uma outra classe que passa uma matriz numérica.

A chamada tah assim:

BufferedImage imagemAUX = objetoConverter.vetorToBufferedImage(matrizProcessada);

E será q o problema não está nessa matriz? Não entendo muito de geração de imagens em Java mas tenho uma classe q faz a geração (inclusive com redimensionamento) e funciona perfeitamente, mas a entrada do BufferedImage é uma conversão de um ByteArrayOutputStream para um Array de bytes. Acredito q o problema esteja na geração da “matrizProcessada”.

F
fabiocortolan:
FelipeMonte:
Em uma outra classe que passa uma matriz numérica.

A chamada tah assim:

BufferedImage imagemAUX = objetoConverter.vetorToBufferedImage(matrizProcessada);

E será q o problema não está nessa matriz? Não entendo muito de geração de imagens em Java mas tenho uma classe q faz a geração (inclusive com redimensionamento) e funciona perfeitamente, mas a entrada do BufferedImage é uma conversão de um ByteArrayOutputStream para um Array de bytes. Acredito q o problema esteja na geração da "matrizProcessada".

Como falei no primeiro post, ja testei a matriz e ela esta correta. O problema está em algum lugar no método, tal é que utilizando outro método semelhante ele retorna a imagem, porem rotacionada e espelhada. Caso alguem encontre o problema desse método tambem serve. Esse outro método é este:

public BufferedImage doubleToBufferedImage(double[][] mtzImg) {
        //matriz que vc passa como parâmetro definindo a largura da imagem
        int altura = mtzImg.length,
        //matriz que vc passa como parâmetro definindo a altura da imagem
        largura = mtzImg[0].length;
        
        //criando uma objeto BufferedImage a partir das dimensões da imagem representada pela matriz
        BufferedImage image = new BufferedImage(altura, largura, BufferedImage.TYPE_BYTE_GRAY);
        
        WritableRaster raster = image.getRaster();
        for (int h = 0; h &lt; altura; h++) {
            for (int w = 0; w &lt; largura; w++) {
                raster.setSample(h, w, 0, mtzImg[h][w]);
            }
        }
        return image;
    }
F

Pessoal, como esse método não tava saindo fiz outro e este deu certo (mas não usa ByteArrayInputStream). Caso alguem consiga achar um erro nesse que usa o ByteArrayInputStream, por favor, poste o erro pois serviria de resposta para broblemas futuros. De qualquer maneira o método que fiz consegue converter a matriz para BufferedImage com sucesso. Vou postá-lo aqui para caso algum dia alguem precise.

public BufferedImage doubleToBufferedImage(double[][] matrizImagem) {
        int tom, x, y, altura, largura;
        Color pixel;
        
        altura = matrizImagem.length;
        largura = matrizImagem[0].length;
        
        BufferedImage imagem = new BufferedImage(largura, altura, BufferedImage.TYPE_BYTE_GRAY);
        
        //obtem a imagem
        for( x = 0; x < largura;  x++ ) {
            for( y = 0; y < altura; y++ ) {
                tom = (int) matrizImagem[y][x];
                pixel = new Color(tom, tom, tom);
                imagem.setRGB(x, y, pixel.getRGB());
            }
        }
        return imagem;
    }
Criado 26 de abril de 2013
Ultima resposta 26 de abr. de 2013
Respostas 5
Participantes 2