C # kullanarak, bir Windows'u dönüştürmek için daha iyi bir yol yoktur Bitmap
bir karşı byte[]
geçici bir dosyaya kaydetme ve bir kullanarak sonuç okumaktan daha FileStream
?
C # kullanarak, bir Windows'u dönüştürmek için daha iyi bir yol yoktur Bitmap
bir karşı byte[]
geçici bir dosyaya kaydetme ve bir kullanarak sonuç okumaktan daha FileStream
?
Yanıtlar:
Birkaç yol var.
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
Bu, çok fazla kod gerektirmediği için uygundur.
Bellek Akışı
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
Dosya diske değil belleğe kaydedilmiş olması dışında, yaptığınızla eşdeğerdir. Daha fazla kod olmasına rağmen ImageFormat seçeneğiniz vardır ve belleğe veya diske kaydetme arasında kolayca değiştirilebilir.
ImageConverter
yöntemin resmi Png olarak kaydedeceğini ve BÜYÜK dosyalar elde edeceğini unutmayın.
ImageConverter
Kullanabileceğiniz .net standardı değilMemoryStream
Bir MemoryStream bunun için yardımcı olabilir. Bir uzantı yöntemine koyabilirsiniz:
public static class ImageExtensions
{
public static byte[] ToByteArray(this Image image, ImageFormat format)
{
using(MemoryStream ms = new MemoryStream())
{
image.Save(ms, format);
return ms.ToArray();
}
}
}
Sadece şöyle kullanabilirsiniz:
var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);
Prestomanifto'nun ImageConverter ile ilgili cevabına kısmen katılmıyorum. ImageConverter kullanmayın. Teknik olarak yanlış bir şey yok, ancak nesneden boks / kutudan çıkarma kullanması bana .NET çerçevesinin eski karanlık yerlerinden kod olduğunu ve görüntü işleme ile kullanmak için ideal olmadığını söylüyor (bir bayta dönüştürmek için aşırıya kaçıyor) [] en azından), özellikle aşağıdakileri göz önünde bulundurduğunuzda.
ImageConverter
.Net çerçevesi tarafından kullanılan koda bir göz attım ve dahili olarak neredeyse yukarıda sağladığımla aynı kodu kullanıyor. Yeni bir dosya oluşturur MemoryStream
, Bitmap
bunu sağladığınız formatta kaydeder ve diziyi döndürür. ImageConverter
Kullanarak sınıf oluşturmanın ek yükünü atlaMemoryStream
Ayrıca sadece Marshal. Bitmap verilerini kopyalayabilirsiniz. Ara bellek akışı vb. Ve hızlı bellek kopyası yok. Bu, hem 24 bit hem de 32 bit bitmap'lerde çalışmalıdır.
public static byte[] BitmapToByteArray(Bitmap bitmap)
{
BitmapData bmpdata = null;
try
{
bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
int numbytes = bmpdata.Stride * bitmap.Height;
byte[] bytedata = new byte[numbytes];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, bytedata, 0, numbytes);
return bytedata;
}
finally
{
if (bmpdata != null)
bitmap.UnlockBits(bmpdata);
}
}
.
Görüntüyü bir MemoryStream'e kaydedin ve bayt dizisini alın.
http://msdn.microsoft.com/en-us/library/ms142148.aspx
Byte[] data;
using (var memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Bmp);
data = memoryStream.ToArray();
}
System.Drawing.Image
(bakınız: docs.microsoft.com/en-us/dotnet/api/... )
System.Drawing.Image does not exist
. Yani .. hayır, çalışmıyor :(
MemoryStream
Bunun yerine a yerine kullanın FileStream
:
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
ToArray
, değil GetBuffer
.
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.
Şimdi gelen bayt dizisi GetBuffer
görüntüyü artı kullanılmayan baytları döndürecek ve bu da muhtemelen bozuk bir görüntüye neden olacaktır.
Takip etmeyi dene:
MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] byteArray = stream.GetBuffer();
Kullandığınızdan emin olun:
System.Drawing & using System.Drawing.Imaging;
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
Daha basit:
return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[]))
Bunu sadece bir satırda çok basit kullanın:
byte[] imgdata = File.ReadAllBytes(@"C:\download.png");