Exemple de code pour modifier une image dans un tableau d'octets
publicbyte[]ImageToByteArray(System.Drawing.Image imageIn){
using (var ms =newMemoryStream()){
imageIn.Save(ms,imageIn.RawFormat);return ms.ToArray();}}
au lieu de System.Drawing.Imaging.ImageFormat.Gif, vous pouvez utiliser imageIn.RawFormat Cela ne semble pas être répétées, ou, au moins, après quelques temps de la conversion, étrange GDI+ erreurs commencent à se produire. Le ImageConverter solution trouvée ci-dessous semble à éviter ces erreurs. Peut-être mieux d'utiliser le format png, aujourd'hui.
publicbyte[] imageToByteArray(System.Drawing.Image imageIn){MemoryStream ms =newMemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);return ms.ToArray();}publicImage byteArrayToImage(byte[] byteArrayIn){MemoryStream ms =newMemoryStream(byteArrayIn);Image returnImage =Image.FromStream(ms);return returnImage;}
imageToByteArray(Système d'.De dessin.Image imageIn) imageIn est le chemin de l'image ou quoi que ce soit d'autre la façon dont nous pouvons nous passer de l'image de cette C'est ce que je fais quand j'ai besoin de convertir une image en un tableau d'octets ou le dos. Vous avez oublié de fermer la memorystream...btw c'est copié directement à partir de: lien L'appel de Disposer de ne pas nettoyer la mémoire utilisée par MemoryStream plus vite, au moins dans l'implémentation actuelle. En fait, si vous la fermez, vous ne serez pas en mesure d'utiliser le Image par la suite, vous obtiendrez un RIB erreur.
Voici ce que je suis en train d'utiliser. Certains des autres techniques que j'ai essayé ont été non-optimale car ils ont changé la profondeur de bit des pixels (24-bits et 32-bits) ou ignoré la résolution de l'image (dpi).
//ImageConverter object used to convert byte arrays containing JPEG or PNG file images into // Bitmap objects. This is static and only gets instantiated once.privatestaticreadonlyImageConverter _imageConverter =newImageConverter();
Image de tableau d'octets:
///<summary>///Method to "convert" an Image object into a byte array, formatted in PNG file format, which ///provides lossless compression. This can be used together with the GetImageFromByteArray() ///method to provide a kind of serialization /deserialization. ///</summary>///<param name="theImage">Image object, must be convertable to PNG format</param>///<returns>byte array image of a PNG file containing the image</returns>publicstaticbyte[]CopyImageToByteArray(Image theImage){
using (MemoryStream memoryStream =newMemoryStream()){
theImage.Save(memoryStream,ImageFormat.Png);return memoryStream.ToArray();}}
Tableau d'octets de l'Image:
///<summary>///Method that uses the ImageConverter object in .Net Framework to convert a byte array, ///presumably containing a JPEG or PNG file image, into a Bitmap object, which can also be ///used as an Image object.///</summary>///<param name="byteArray">byte array containing JPEG or PNG file image or similar</param>///<returns>Bitmap object if it works, else exception is thrown</returns>publicstaticBitmapGetImageFromByteArray(byte[] byteArray){Bitmap bm =(Bitmap)_imageConverter.ConvertFrom(byteArray);if(bm !=null&&(bm.HorizontalResolution!=(int)bm.HorizontalResolution||
bm.VerticalResolution!=(int)bm.VerticalResolution)){//Correct a strange glitch that has been observed in the test program when converting // from a PNG file image created by CopyImageToByteArray() - the dpi value "drifts" // slightly away from the nominal integer value
bm.SetResolution((int)(bm.HorizontalResolution+0.5f),(int)(bm.VerticalResolution+0.5f));}return bm;}
Edit: Pour obtenir l'Image de format jpg ou png, vous devez lire le fichier dans un tableau d'octets à l'aide de Fichier.ReadAllBytes():
Cela évite les problèmes liés à la Bitmap vouloir de ses cours d'eau de source à rester ouverts, et certains ont proposé des solutions de contournement à ce problème que le résultat dans le fichier source ne soit verrouillée.
Au cours des tests de ce que je prendrais l'image résultante et de les récupérer dans un tableau d'octets à l'aide de: ImageConverter _imageConverter = new ImageConverter(); lock(SourceImage) { return (byte[])_imageConverter.ConvertTo(SourceImage, typeof(byte[])); } Où il serait par intermittence résultat dans des tableaux de 2 tailles différentes. Ceci survient généralement après 100 itérations, Mais quand je l'obtenir l'image bitmap à l'aide de new Bitmap(SourceFileName); et ensuite l'exécuter par le biais de ce code, il fonctionne très bien. N'ont pas vraiment de toutes les bonnes idées. Est-il cohérent, dont les images ne donnent pas droit à la même sortie que de l'entrée? Avez-vous essayé d'examiner la sortie quand il n'est pas, comme prévu, à voir pourquoi c'est différent? Ou peut-être il n'a pas vraiment d'importance, et l'on peut accepter que "les choses arrivent". Il a été systématiquement passe. N'a jamais trouvé la cause. J'ai le sentiment qu'elle pouvait avoir quelque chose à voir avec un 4K frontière d'octet dans l'allocation de la mémoire. Mais que pourrait difficilement être mauvais. Je suis passé à l'aide d'un MemoryStream avec un BinaryFormatter et j'ai été capable de devenir très cohérent testé avec plus de 250 différentes des images de différents formats et tailles, boucle à plus de 1000 fois pour vérification. Merci pour la réponse.
Vous pouvez utiliser File.ReadAllBytes() méthode pour lire n'importe quel fichier dans le tableau d'octets. Pour écrire le tableau d'octets dans le fichier, il suffit d'utiliser File.WriteAllBytes() méthode.
Espère que cette aide.
Vous pouvez trouver plus d'informations et des exemples de code ici.
Vous voulez seulement les pixels ou de l'ensemble de l'image (y compris les en-têtes) comme un tableau d'octets?
De pixels: Utiliser le CopyPixels méthode sur Bitmap. Quelque chose comme:
var bitmap =newBitmapImage(uri);//Pixel arraybyte[] pixels =newbyte[width * height *4];//account for stride if necessary and whether the image is 32 bit, 16 bit etc.
bitmap.CopyPixels(..size, pixels, fullStride,0);
Si vous n'avez pas de référence à la imageBytes pour transporter des octets dans le flux, la méthode ne retourne rien. Assurez-vous de référence imageBytes = m.ToArray();
publicstaticbyte[]SerializeImage(){MemoryStream m;stringPicPath= pathToImage";byte[] imageBytes;
using (Image image =Image.FromFile(PicPath)){
using ( m =newMemoryStream()){
image.Save(m, image.RawFormat);
imageBytes =newbyte[m.Length];//Very Important
imageBytes = m.ToArray();}//end using}//end usingreturn imageBytes;}//SerializeImage
using System.IO;byte[] img =File.ReadAllBytes(openFileDialog1.FileName);
Ne fonctionne que si il est la lecture d'un fichier (et même alors, il obtient le formaté/octets compressés, pas le matériau premier, à moins que sa BMP)
Exemple de code pour modifier une image dans un tableau d'octets
C# Image de Tableau d'Octets et le Tableau d'Octets à l'Image de la Classe de Convertisseur
System.Drawing.Imaging.ImageFormat.Gif
, vous pouvez utiliserimageIn.RawFormat
Cela ne semble pas être répétées, ou, au moins, après quelques temps de la conversion, étrange GDI+ erreurs commencent à se produire. Le
ImageConverter
solution trouvée ci-dessous semble à éviter ces erreurs.Peut-être mieux d'utiliser le format png, aujourd'hui.
OriginalL'auteur Pranay Rana
Pour la Conversion d'une Image de l'objet à
byte[]
vous pouvez le faire comme suit:OriginalL'auteur AR5HAM
Une autre façon d'obtenir le tableau d'Octets depuis le chemin de l'image est
OriginalL'auteur Neelam
essayez ceci:
C'est ce que je fais quand j'ai besoin de convertir une image en un tableau d'octets ou le dos.
Vous avez oublié de fermer la memorystream...btw c'est copié directement à partir de: lien
L'appel de Disposer de ne pas nettoyer la mémoire utilisée par
MemoryStream
plus vite, au moins dans l'implémentation actuelle. En fait, si vous la fermez, vous ne serez pas en mesure d'utiliser leImage
par la suite, vous obtiendrez un RIB erreur.OriginalL'auteur anishMarokey
Voici ce que je suis en train d'utiliser. Certains des autres techniques que j'ai essayé ont été non-optimale car ils ont changé la profondeur de bit des pixels (24-bits et 32-bits) ou ignoré la résolution de l'image (dpi).
Image de tableau d'octets:
Tableau d'octets de l'Image:
Edit: Pour obtenir l'Image de format jpg ou png, vous devez lire le fichier dans un tableau d'octets à l'aide de Fichier.ReadAllBytes():
Cela évite les problèmes liés à la Bitmap vouloir de ses cours d'eau de source à rester ouverts, et certains ont proposé des solutions de contournement à ce problème que le résultat dans le fichier source ne soit verrouillée.
ImageConverter _imageConverter = new ImageConverter(); lock(SourceImage) { return (byte[])_imageConverter.ConvertTo(SourceImage, typeof(byte[])); }
Où il serait par intermittence résultat dans des tableaux de 2 tailles différentes. Ceci survient généralement après 100 itérations, Mais quand je l'obtenir l'image bitmap à l'aide denew Bitmap(SourceFileName);
et ensuite l'exécuter par le biais de ce code, il fonctionne très bien.N'ont pas vraiment de toutes les bonnes idées. Est-il cohérent, dont les images ne donnent pas droit à la même sortie que de l'entrée? Avez-vous essayé d'examiner la sortie quand il n'est pas, comme prévu, à voir pourquoi c'est différent? Ou peut-être il n'a pas vraiment d'importance, et l'on peut accepter que "les choses arrivent".
Il a été systématiquement passe. N'a jamais trouvé la cause. J'ai le sentiment qu'elle pouvait avoir quelque chose à voir avec un 4K frontière d'octet dans l'allocation de la mémoire. Mais que pourrait difficilement être mauvais. Je suis passé à l'aide d'un MemoryStream avec un BinaryFormatter et j'ai été capable de devenir très cohérent testé avec plus de 250 différentes des images de différents formats et tailles, boucle à plus de 1000 fois pour vérification. Merci pour la réponse.
OriginalL'auteur RenniePet
Vous pouvez utiliser
File.ReadAllBytes()
méthode pour lire n'importe quel fichier dans le tableau d'octets. Pour écrire le tableau d'octets dans le fichier, il suffit d'utiliserFile.WriteAllBytes()
méthode.Espère que cette aide.
Vous pouvez trouver plus d'informations et des exemples de code ici.
OriginalL'auteur Shekhar
Vous voulez seulement les pixels ou de l'ensemble de l'image (y compris les en-têtes) comme un tableau d'octets?
De pixels: Utiliser le
CopyPixels
méthode sur Bitmap. Quelque chose comme:OriginalL'auteur Lasse Espeholt
Si vous n'avez pas de référence à la imageBytes pour transporter des octets dans le flux, la méthode ne retourne rien. Assurez-vous de référence imageBytes = m.ToArray();
OriginalL'auteur Ernest
Code:
OriginalL'auteur Md Shahriar
Ce code récupère les 100 premières lignes de la table dans sql server 2012 et enregistre une image par ligne dans un fichier sur le disque local
OriginalL'auteur Reza