Risposte:
Codice di esempio per modificare un'immagine in una matrice di byte
public byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
using (var ms = new MemoryStream())
{
imageIn.Save(ms,imageIn.RawFormat);
return ms.ToArray();
}
}
C # Image to Byte Array e Byte Array to Image Converter Class
ImageConverter
soluzione trovata di seguito sembra evitare questi errori.
(new Bitmap(imageIn)).Save(ms, imageIn.RawFormat);
.
Per convertire un oggetto Immagine in byte[]
puoi fare come segue:
public static byte[] converterDemo(Image x)
{
ImageConverter _imageConverter = new ImageConverter();
byte[] xByte = (byte[])_imageConverter.ConvertTo(x, typeof(byte[]));
return xByte;
}
.ConvertTo(new Bitmap(x), typeof(byte[]));
.
Un altro modo per ottenere l'array Byte dal percorso dell'immagine è
byte[] imgdata = System.IO.File.ReadAllBytes(HttpContext.Current.Server.MapPath(path));
Ecco cosa sto usando attualmente. Alcune delle altre tecniche che ho provato non sono state ottimali perché hanno cambiato la profondità di bit dei pixel (24 bit contro 32 bit) o hanno ignorato la risoluzione dell'immagine (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.
private static readonly ImageConverter _imageConverter = new ImageConverter();
Da immagine a matrice di byte:
/// <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>
public static byte[] CopyImageToByteArray(Image theImage)
{
using (MemoryStream memoryStream = new MemoryStream())
{
theImage.Save(memoryStream, ImageFormat.Png);
return memoryStream.ToArray();
}
}
Matrice di byte in immagine:
/// <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>
public static Bitmap GetImageFromByteArray(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;
}
Modifica: per ottenere l'immagine da un file jpg o png devi leggere il file in un array di byte usando File.ReadAllBytes ():
Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(fileName));
Ciò evita i problemi relativi a Bitmap che desidera che il suo flusso di origine venga mantenuto aperto e alcune soluzioni alternative suggerite a quel problema che comportano il blocco del file di origine.
ImageConverter _imageConverter = new ImageConverter(); lock(SourceImage) { return (byte[])_imageConverter.ConvertTo(SourceImage, typeof(byte[])); }
Dove risulterebbe in modo intermittente in array di 2 diverse dimensioni. Questo normalmente accadrebbe dopo circa 100 iterazioni, ma quando ottengo la bitmap usando new Bitmap(SourceFileName);
e poi la eseguo attraverso quel codice funziona bene.
prova questo:
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
MemoryStream
più velocemente la memoria utilizzata da nessuno, almeno nell'attuale implementazione. Infatti, se lo chiudi, non sarai in grado di usare il Image
dopo, otterrai un errore GDI.
È possibile utilizzare il File.ReadAllBytes()
metodo per leggere qualsiasi file nell'array di byte. Per scrivere un array di byte in un file, usa semplicemente il File.WriteAllBytes()
metodo.
Spero che questo ti aiuti.
Puoi trovare ulteriori informazioni e codice di esempio qui .
Vuoi solo i pixel o l'intera immagine (comprese le intestazioni) come un array di byte?
Per i pixel: usa il CopyPixels
metodo su Bitmap. Qualcosa di simile a:
var bitmap = new BitmapImage(uri);
//Pixel array
byte[] pixels = new byte[width * height * 4]; //account for stride if necessary and whether the image is 32 bit, 16 bit etc.
bitmap.CopyPixels(..size, pixels, fullStride, 0);
Codice:
using System.IO;
byte[] img = File.ReadAllBytes(openFileDialog1.FileName);
Se non fai riferimento a imageBytes per trasportare i byte nel flusso, il metodo non restituirà nulla. Assicurati di fare riferimento a imageBytes = m.ToArray ();
public static byte[] SerializeImage() {
MemoryStream m;
string PicPath = pathToImage";
byte[] imageBytes;
using (Image image = Image.FromFile(PicPath)) {
using ( m = new MemoryStream()) {
image.Save(m, image.RawFormat);
imageBytes = new byte[m.Length];
//Very Important
imageBytes = m.ToArray();
}//end using
}//end using
return imageBytes;
}//SerializeImage
[NB] Se ancora non vedi l'immagine nel browser ho scritto un passo dettagliato per la risoluzione dei problemi
Questo è il codice per convertire l'immagine di qualsiasi tipo (ad esempio PNG, JPG, JPEG) in un array di byte
public static byte[] imageConversion(string imageName){
//Initialize a file stream to read the image file
FileStream fs = new FileStream(imageName, FileMode.Open, FileAccess.Read);
//Initialize a byte array with size of stream
byte[] imgByteArr = new byte[fs.Length];
//Read data from the file stream and put into the byte array
fs.Read(imgByteArr, 0, Convert.ToInt32(fs.Length));
//Close a file stream
fs.Close();
return imageByteArr
}
Per convertire l'immagine in array di byte. Il codice è dato di seguito.
public byte[] ImageToByteArray(System.Drawing.Image images)
{
using (var _memorystream = new MemoryStream())
{
images.Save(_memorystream ,images.RawFormat);
return _memorystream .ToArray();
}
}
Per convertire l'array Byte in immagine. Il codice è dato di seguito. Il codice è gestito A Generic error occurred in GDI+
in Image Save.
public void SaveImage(string base64String, string filepath)
{
// image convert to base64string is base64String
//File path is which path to save the image.
var bytess = Convert.FromBase64String(base64String);
using (var imageFile = new FileStream(filepath, FileMode.Create))
{
imageFile.Write(bytess, 0, bytess.Length);
imageFile.Flush();
}
}
Questo codice recupera le prime 100 righe dalla tabella in SQLSERVER 2012 e salva un'immagine per riga come file su disco locale
public void SavePicture()
{
SqlConnection con = new SqlConnection("Data Source=localhost;Integrated security=true;database=databasename");
SqlDataAdapter da = new SqlDataAdapter("select top 100 [Name] ,[Picture] From tablename", con);
SqlCommandBuilder MyCB = new SqlCommandBuilder(da);
DataSet ds = new DataSet("tablename");
byte[] MyData = new byte[0];
da.Fill(ds, "tablename");
DataTable table = ds.Tables["tablename"];
for (int i = 0; i < table.Rows.Count;i++ )
{
DataRow myRow;
myRow = ds.Tables["tablename"].Rows[i];
MyData = (byte[])myRow["Picture"];
int ArraySize = new int();
ArraySize = MyData.GetUpperBound(0);
FileStream fs = new FileStream(@"C:\NewFolder\" + myRow["Name"].ToString() + ".jpg", FileMode.OpenOrCreate, FileAccess.Write);
fs.Write(MyData, 0, ArraySize);
fs.Close();
}
}
nota: la directory con il nome NewFolder dovrebbe esistere in C: \
System.Drawing.Imaging.ImageFormat.Gif
, puoi usareimageIn.RawFormat