Convertir une image bitmap dans un tableau d'octets
À l'aide de C#, est-il un meilleur moyen de convertir un Windows Bitmap
à un byte[]
que l'enregistrement dans un fichier temporaire et la lecture du résultat à l'aide d'un FileStream
?
Vous devez vous connecter pour publier un commentaire.
Il ya un couple de façons.
ImageConverter
Celui-ci est pratique car il ne nécessite pas beaucoup de code.
Flux De Mémoire
Celui-ci est équivalent à ce que vous faites, sauf le fichier est sauvegardé dans la mémoire plutôt que sur le disque. Bien que plus de code, vous avez la possibilité de ImageFormat et il peut facilement être modifiée entre la mise en mémoire ou sur disque.
Source: http://www.vcskicks.com/image-to-byte.php
ImageConverter
méthode permettra d'économiser de l'image comme Png, entraînant de gros fichiers.ImageConverter
ne l'est pas .net standard, vous pouvez utiliserMemoryStream
Un MemoryStream peut être utile pour cela. Vous pourriez le mettre dans une méthode d'extension:
Vous pouvez simplement l'utiliser comme:
Je suis partiellement en désaccord avec prestomanifto de réponse en ce qui concerne la ImageConverter. Ne pas utiliser ImageConverter. Il n'y a rien de techniquement incorrect avec elle, mais simplement le fait qu'il utilise boxing/unboxing de l'objet me dit que c'est le code de la vieille endroits sombres de la .NET framework et ce n'est pas idéal pour une utilisation avec le traitement de l'image (c'est exagéré pour la conversion à un byte[] au moins), surtout quand on considère la suite.
J'ai pris un coup d'oeil à la
ImageConverter
le code utilisé par l' .Net framework, et en interne, il utilise un code presque identique à celle que j'ai fournis ci-dessus. Il crée un nouveauMemoryStream
, enregistre leBitmap
sous quelque forme qu'elle se trouvait lorsque vous avez fourni, et retourne un tableau. Passez une charge supplémentaire de la création d'unImageConverter
classe à l'aide deMemoryStream
Vous pouvez également Maréchal.Copiez les données de l'image. Pas d'intermédiaire memorystream etc. et une vitesse de copie de mémoire. Cela doit fonctionner sur 24 bits et 32 bits des bitmaps.
.
LockBits
vous devriez toujours appelUnlockBits
. Votre code ne fonctionne pas. Untry-finally
pourrait l'aider.LockBits
,ImageLockMode
etPixelFormat
n'existe pas.Enregistrer l'Image dans un MemoryStream et prenez ensuite le tableau d'octets.
http://msdn.microsoft.com/en-us/library/ms142148.aspx
System.Drawing.Image
(voir: docs.microsoft.com/en-us/dotnet/api/... )System.Drawing.Image does not exist
. Donc .. pas de, ne fonctionne pas 🙁Utiliser un
MemoryStream
au lieu d'unFileStream
, comme ceci:ToArray
, pasGetBuffer
.Note that the buffer contains allocated bytes which might be unused. For example, if the string "test" is written into the MemoryStream object, the length of the buffer returned from GetBuffer is 256, not 4, with 252 bytes unused. To obtain only the data in the buffer, use the ToArray method.
Alors maintenant, le tableau d'octets à partirGetBuffer
sera de retour l'image et les octets non utilisés, qui sera probablement entraîner une corruption de l'image.Essayez ce qui suit:
Assurez-vous que vous utilisez:
Je crois que vous pouvez tout simplement faire:
De plus simple:
Très simple d'utilisation ce juste une ligne: