Comment puis-je prendre un tableau d'octets d'une image TIFF et le transformer en un objet System.Drawing.Image ?

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

  •  09-06-2019
  •  | 
  •  

Question

j'ai un byte[] tableau dont le contenu représente un fichier TIFF (comme dans, si j'écris ces octets directement dans un fichier en utilisant le BinaryWriter objet, il forme un fichier TIFF parfaitement valide) et j'essaie de le transformer en un objet System.Drawing.Image afin de pouvoir l'utiliser pour une manipulation ultérieure (alimenter un objet TIFF multipage)

Le problème que j'ai est que le code communément accepté pour cette tâche :

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

ça ne marche pas pour moi.La deuxième ligne de la méthode ci-dessus où elle appelle le Image.FromStream la méthode meurt au moment de l'exécution, en disant

Parameter Not Valid

Je crois que la méthode s'étouffe avec le fait qu'il s'agit d'un fichier TIFF mais je n'arrive pas à comprendre comment créer le FromStream méthode accepte ce fait.

Comment transformer un tableau d'octets d'une image TIFF en un objet Image ?

De plus, comme je l'ai dit, l'objectif final est d'avoir un tableau d'octets représentant un fichier TIFF multipage, qui contient les fichiers TIFF pour lesquels j'ai actuellement des objets de tableau d'octets.S’il existe une bien meilleure façon de procéder, je suis tout à fait d’accord.

Était-ce utile?

La solution

Modifier: L'hypothèse ci-dessous n'est pas correcte, j'ai eu la chance de lancer mon IDE plus tard et de tester avec et sans écriture et les deux ont rempli correctement le MemoryStream.

Je pense que vous devez d'abord écrire sur votre MemeoryStream.

Comme si ma mémoire (sans jeu de mots) me sert correctement ceci :

MemoryStream ms = new MemoryStream(byteArrayIn);

Crée un flux de mémoire de cette taille.

Vous devez ensuite écrire le contenu de votre tableau d'octets dans le flux mémoire :

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

Voyez si cela résout le problème.

Autres conseils

OK, j'ai trouvé le problème, et il provenait d'une partie du code sans rapport avec la partie du code sur laquelle je posais la question.Les données étaient transmises sous forme de chaîne, je les convertissais en un tableau d'octets (c'était un banc de test donc j'essayais de simuler le tableau d'octets que j'obtiens dans l'application principale), puis je le convertissais en un MemoryStream, puis en créant une image à partir de cela.

Ce que je n'ai pas réalisé, c'est que la chaîne était codée en Base64.Appel Convert.FromBase64String() l'a fait se transformer en un tableau d'octets qui ne tuerait pas le Image.FromStream() méthode.

Donc, en gros, cela se résumait à une erreur stupide de ma part.Mais bon, le code ci-dessus est toujours utile et cette page servira probablement de résultat à Google pour savoir comment éviter cette erreur à quelqu'un d'autre.

De plus, j'ai trouvé un moyen simple de construire un TIFF multipage à partir de mes tableaux d'octets ici.

Tous ces indices m'ont aidé à comprendre mon problème, qui était le même que celui posé par la question.Je souhaite donc publier ma solution à laquelle je suis arrivé grâce à ces indices utiles.Merci pour tous les indices postés jusqu'à présent !

Comme Time Saunders l'a posté dans sa réponse, cette méthode Write pour écrire réellement les octets dans le flux mémoire est essentielle.Ce fut ma première erreur.

Ensuite, mes données étaient également de mauvaises données TIFF, mais dans mon cas, j'avais un caractère supplémentaire 13 au début de mes données d'image.Une fois que j'ai supprimé cela, tout a bien fonctionné pour moi.

Lorsque j'ai lu certaines spécifications de base du format de fichier TIFF, j'ai découvert que les fichiers TIFF doivent commencer par II ou MM (deux octets avec des valeurs de 73 ou 77).II signifie que l'ordre des octets petit-boutiste (« Ordre des octets Intel ») est utilisé.MM signifie que la grande fin (« ordre des octets Motorola ») est utilisée.Les deux octets suivants sont une valeur entière de deux octets ( = Int16 dans .NET) de 42, binaire 101010.

Ainsi, un flux d'octets TIFF correct commence par les valeurs d'octets décimales de :73, 73, 42, 0 ou 77, 77, 0, 42.J'encourage toute personne rencontrant le même problème que nous à inspecter votre flux d'octets de données TIFF et à vous assurer que vos données sont des données TIFF valides !

Merci Schnapple et Tim Saunders !!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top