การใช้ C # มีวิธีที่ดีกว่าในการแปลง Windows Bitmap
เป็น a byte[]
มากกว่าการบันทึกเป็นไฟล์ชั่วคราวและอ่านผลลัพธ์โดยใช้FileStream
?
การใช้ C # มีวิธีที่ดีกว่าในการแปลง Windows Bitmap
เป็น a byte[]
มากกว่าการบันทึกเป็นไฟล์ชั่วคราวและอ่านผลลัพธ์โดยใช้FileStream
?
คำตอบ:
มีสองวิธี
ImageConverter
public static byte[] ImageToByte(Image img)
{
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[]));
}
อันนี้สะดวกเพราะมันไม่ต้องการรหัสจำนวนมาก
สตรีมหน่วยความจำ
public static byte[] ImageToByte2(Image img)
{
using (var stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
return stream.ToArray();
}
}
อันนี้เทียบเท่ากับสิ่งที่คุณกำลังทำยกเว้นไฟล์จะถูกบันทึกลงในหน่วยความจำแทนที่จะเป็นดิสก์ แม้ว่ารหัสเพิ่มเติมคุณมีตัวเลือกของ ImageFormat และสามารถแก้ไขได้ง่ายระหว่างการบันทึกลงในหน่วยความจำหรือดิสก์
ImageConverter
วิธีการนี้จะบันทึกภาพเป็น Png ส่งผลให้มีไฟล์จำนวนมาก
ImageConverter
ไม่ใช่. net มาตรฐานที่คุณอาจใช้MemoryStream
MemoryStreamจะมีประโยชน์สำหรับการนี้ คุณสามารถใส่ไว้ในวิธีการขยาย:
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();
}
}
}
คุณสามารถใช้มันได้เช่น:
var image = new Bitmap(10, 10);
// Draw your image
byte[] arr = image.ToByteArray(ImageFormat.Bmp);
ฉันไม่เห็นด้วยกับคำตอบของ prestomanifto บางส่วนเกี่ยวกับ ImageConverter ห้ามใช้ ImageConverter ไม่มีอะไรผิดปกติทางเทคนิคกับมัน แต่เพียงความจริงที่ว่ามันใช้มวย / unboxing จากวัตถุบอกฉันว่ามันเป็นรหัสจากที่มืดเก่าของ. NET Framework และไม่เหมาะที่จะใช้กับการประมวลผลภาพ (มันเกินจริงสำหรับการแปลงเป็นไบต์ [] อย่างน้อย) โดยเฉพาะเมื่อคุณพิจารณาสิ่งต่อไปนี้
ฉันดูที่ImageConverter
รหัสที่ใช้โดยกรอบงาน. Net และภายในจะใช้รหัสเกือบเหมือนกันกับที่ฉันให้ไว้ข้างต้น มันจะสร้างใหม่MemoryStream
บันทึกBitmap
สิ่งที่อยู่ในรูปแบบที่คุณให้ไว้และส่งกลับอาร์เรย์ ข้ามโอเวอร์เฮดแบบพิเศษของการสร้างImageConverter
คลาสโดยใช้MemoryStream
คุณสามารถเพียงแค่ Marshal.Copy ข้อมูลบิตแมป ไม่มีหน่วยความจำตัวกลางและอื่น ๆ และคัดลอกหน่วยความจำอย่างรวดเร็ว สิ่งนี้ควรใช้กับบิตแมปทั้งแบบ 24 บิตและ 32 บิต
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);
}
}
.
บันทึกภาพลงใน MemoryStream แล้วคว้าอาร์เรย์ไบต์
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
(ดู: docs.microsoft.com/en-us/dotnet/api/… )
System.Drawing.Image does not exist
และฉันได้รับ ดังนั้น .. ไม่ไม่ทำงาน :(
ใช้ a MemoryStream
แทนFileStream
เช่นนี้
MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();
ToArray
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.
ดังนั้นตอนนี้อาร์เรย์ไบต์จากGetBuffer
จะส่งคืนรูปภาพพร้อมไบต์ที่ไม่ได้ใช้ซึ่งอาจส่งผลให้เกิดภาพเสียหาย
ลองทำสิ่งต่อไปนี้:
MemoryStream stream = new MemoryStream();
Bitmap bitmap = new Bitmap();
bitmap.Save(stream, ImageFormat.Jpeg);
byte[] byteArray = stream.GetBuffer();
ตรวจสอบให้แน่ใจว่าคุณใช้:
System.Drawing & using System.Drawing.Imaging;
ฉันเชื่อว่าคุณทำได้ง่ายๆ
ImageConverter converter = new ImageConverter();
var bytes = (byte[])converter.ConvertTo(img, typeof(byte[]));
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
ง่ายขึ้น:
return (byte[])System.ComponentModel.TypeDescriptor.GetConverter(pImagen).ConvertTo(pImagen, typeof(byte[]))
ใช้ง่ายมากเพียงแค่ในบรรทัดเดียว:
byte[] imgdata = File.ReadAllBytes(@"C:\download.png");