Como posso pegar uma matriz de bytes de uma imagem TIFF e transformá-la em um objeto System.Drawing.Image?

StackOverflow https://stackoverflow.com/questions/32750

  •  09-06-2019
  •  | 
  •  

Pergunta

eu tenho um byte[] array, cujo conteúdo representa um arquivo TIFF (como em, se eu escrever esses bytes diretamente em um arquivo usando o BinaryWriter objeto, ele forma um arquivo TIFF perfeitamente válido) e estou tentando transformá-lo em um objeto System.Drawing.Image para que eu possa usá-lo para manipulação posterior (alimentando um objeto TIFF de várias páginas)

O problema que estou tendo é que o código comumente aceito para esta tarefa:

    public Image byteArrayToImage(byte[] byteArrayIn)
    {
        MemoryStream ms = new MemoryStream(byteArrayIn);
        Image returnImage = Image.FromStream(ms, true);
        return returnImage;
    }

não funciona para mim.A segunda linha do método acima, onde ele chama o Image.FromStream método morre em tempo de execução, dizendo

Parameter Not Valid

Acredito que o método esteja engasgado com o fato de ser um arquivo TIFF, mas não consigo descobrir como fazer o FromStream método aceita esse fato.

Como faço para transformar uma matriz de bytes de uma imagem TIFF em um objeto Image?

Além disso, como eu disse, o objetivo final disso é ter uma matriz de bytes representando um arquivo TIFF de várias páginas, que contém os arquivos TIFF para os quais tenho objetos de matriz de bytes no momento.Se houver uma maneira muito melhor de fazer isso, sou totalmente a favor.

Foi útil?

Solução

Editar: A suposição abaixo não está correta, tive a chance de iniciar meu IDE mais tarde e testar com e sem Write e ambos preencheram o MemoryStream corretamente.

Acho que você precisa escrever primeiro no seu MemeoryStream.

Como se minha memória (sem trocadilhos) me servisse corretamente:

MemoryStream ms = new MemoryStream(byteArrayIn);

Cria um fluxo de memória desse tamanho.

Você então precisa gravar o conteúdo da matriz de bytes no fluxo de memória:

ms.Write(byteArrayIn, 0, byteArrayIn.Length);

Veja se isso resolve.

Outras dicas

OK, encontrei o problema e era de uma parte do código não relacionada à parte do código que eu estava perguntando.Os dados estavam sendo passados ​​​​como uma string, eu estava convertendo-os em uma matriz de bytes (este era um equipamento de teste, então eu estava tentando simular a matriz de bytes que obtenho no aplicativo principal), depois convertendo-os em um MemoryStream e, em seguida, fazendo uma imagem disso.

O que não percebi foi que a string era codificada em Base64.Chamando Convert.FromBase64String() fez com que ele se transformasse em uma matriz de bytes que não mataria o Image.FromStream() método.

Então, basicamente, tudo se resumiu a um erro estúpido da minha parte.Mas ei, o código acima ainda é útil e esta página provavelmente servirá como um resultado do Google sobre como evitar esse erro para outra pessoa.

Além disso, encontrei uma maneira fácil de construir um TIFF de várias páginas a partir de minhas matrizes de bytes aqui.

Todas essas foram pistas que me ajudaram a descobrir o meu problema, que era o mesmo que a pergunta pergunta.Então, quero postar minha solução, à qual cheguei por causa dessas dicas úteis.Obrigado por todas as pistas postadas até agora!

Como Time Saunders postou em sua resposta, o método Write para realmente gravar os bytes no fluxo de memória é essencial.Este foi meu primeiro erro.

Então meus dados também eram dados TIFF ruins, mas no meu caso, eu tinha um caractere extra 13 no início dos meus dados de imagem.Depois que removi isso, tudo funcionou bem para mim.

Quando li sobre algumas especificações básicas de formato de arquivo TIFF, descobri que os arquivos TIFF devem começar com II ou MM (dois bytes com valores de 73 ou 77).II significa que a ordem de bytes little-endian ('ordenação de bytes Intel') é usada.MM significa que o final grande ('ordenação de bytes da Motorola') é usado.Os próximos dois bytes são um valor inteiro de dois bytes (= Int16 em .NET) de 42, binário 101010.

Assim, um fluxo de bytes TIFF correto começa com os valores de bytes decimais de:73, 73, 42, 0 ou 77, 77, 0, 42.Encorajo qualquer pessoa com o mesmo problema que enfrentamos a inspecionar seu fluxo de bytes de dados TIFF e certificar-se de que seus dados sejam dados TIFF válidos!

Obrigado Schnapple e Tim Saunders!!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top