Sử dụng C #, là có một cách tốt hơn để chuyển đổi Windows Bitmap
để một byte[]
hơn tiết kiệm vào một tập tin tạm thời và đọc kết quả bằng cách sử dụng FileStream
?
Sử dụng C #, là có một cách tốt hơn để chuyển đổi Windows Bitmap
để một byte[]
hơn tiết kiệm vào một tập tin tạm thời và đọc kết quả bằng cách sử dụng FileStream
?
Câu trả lời:
Có một vài cách.
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
Điều này là thuận tiện vì nó không đòi hỏi nhiều mã.
Luồng bộ nhớ
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
Cái này tương đương với những gì bạn đang làm, ngoại trừ tập tin được lưu vào bộ nhớ thay vì vào đĩa. Mặc dù có nhiều mã hơn, bạn có tùy chọn ImageFormat và nó có thể dễ dàng sửa đổi giữa việc lưu vào bộ nhớ hoặc đĩa.
ImageConverter
phương thức này sẽ lưu hình ảnh dưới dạng Png, dẫn đến các tệp HUGE.
ImageConverter
không phải là .net tiêu chuẩn bạn có thể sử dụngMemoryStream
Một MemoryStream có thể hữu ích cho việc này. Bạn có thể đặt nó trong một phương thức mở rộng:
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();
}
}
}
Bạn chỉ có thể sử dụng nó như:
var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);
Tôi không đồng ý một phần với câu trả lời của uy tín liên quan đến ImageConverter. Không sử dụng ImageConverter. Không có gì sai về mặt kỹ thuật với nó, nhưng đơn giản là việc nó sử dụng quyền anh / unboxing từ đối tượng cho tôi biết đó là mã từ các vị trí tối cũ của khung .NET và nó không lý tưởng để sử dụng với xử lý hình ảnh (nó quá mức cần thiết để chuyển đổi thành byte [] ít nhất), đặc biệt là khi bạn xem xét những điều sau đây.
Tôi đã xem ImageConverter
mã được sử dụng bởi khung .Net và bên trong nó sử dụng mã gần giống với mã tôi đã cung cấp ở trên. Nó tạo ra một cái mới MemoryStream
, lưu Bitmap
ở bất kỳ định dạng nào khi bạn cung cấp và trả về mảng. Bỏ qua chi phí phụ của việc tạo một ImageConverter
lớp bằng cách sử dụngMemoryStream
Bạn cũng có thể chỉ Marshal.Copy dữ liệu bitmap. Không có bộ nhớ trung gian, vv và một bản sao bộ nhớ nhanh. Điều này sẽ hoạt động trên cả bitmap 24 bit và 32 bit.
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);
}
}
.
Lưu hình ảnh vào MemoryStream và sau đó lấy mảng byte.
http://msdn.microsoft.com/en-us/l Library / ms142148.aspx
Byte[] data;
using (var memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Bmp);
data = memoryStream.ToArray();
}
System.Drawing.Image
(xem: docs.microsoft.com/en-us/dotnet/api/iêu )
System.Drawing.Image does not exist
. Vì vậy, không, không hoạt động :(
Sử dụng MemoryStream
thay vì a FileStream
, như thế này:
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
ToArray
, không 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.
Vì vậy, bây giờ mảng byte từ GetBuffer
sẽ trả về hình ảnh cộng với các byte không được sử dụng, điều này có thể sẽ dẫn đến hình ảnh bị hỏng.
Hãy thử như sau:
MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] byteArray = stream.GetBuffer();
Hãy chắc chắn rằng bạn đang sử dụng:
System.Drawing & using System.Drawing.Imaging;
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
Đơn giản hơn:
return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[]))
Rất đơn giản sử dụng điều này chỉ trong một dòng:
byte[] imgdata = File.ReadAllBytes(@"C:\download.png");