답변:
몇 가지 방법이 있습니다.
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);
ImageConverter와 관련하여 prestomanifto의 답변에 부분적으로 동의하지 않습니다. ImageConverter를 사용하지 마십시오. 기술적으로 잘못된 것은 없지만 객체에서 boxing / unboxing을 사용한다는 사실은 .NET 프레임 워크의 오래된 어두운 곳에서 가져온 코드이며 이미지 처리에 사용하기에는 이상적이지 않다는 것을 나타냅니다 (바이트로 변환하기에는 너무 과도합니다) [] 적어도), 특히 다음을 고려할 때.
ImageConverter
.Net 프레임 워크에서 사용 하는 코드를 살펴 보았으며 내부적으로 위에서 제공 한 코드와 거의 동일한 코드를 사용합니다. 새로운을 생성하고 제공했을 때의 형식으로 MemoryStream
저장 Bitmap
하고 배열을 반환합니다. 다음 ImageConverter
을 사용하여 클래스 를 만드는 추가 오버 헤드를 건너 뜁니다.MemoryStream
비트 맵 데이터를 복사 할 수도 있습니다. 중간 메모리 스트림 등이 없으며 빠른 메모리 사본. 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);
}
}
.
Image를 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
. 그래서 .. 아니, 작동하지 않습니다 :(
다음과 같이를 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;
MemoryStream ms = new MemoryStream();
yourBitmap.Save(ms, ImageFormat.Bmp);
byte[] bitmapData = ms.ToArray();
한 줄로만 사용하면 매우 간단합니다.
byte[] imgdata = File.ReadAllBytes(@"C:\download.png");