[C#] 비트 맵을 바이트 배열로 변환

C #을 사용하면 임시 파일로 저장하고 ?를 사용하여 결과를 읽는 것보다 Windows Bitmap를 변환하는 더 좋은 방법 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 옵션이 있으며 메모리 또는 디스크에 저장하는 사이에 쉽게 수정할 수 있습니다.

출처 : http://www.vcskicks.com/image-to-byte.php


답변

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();
  }


답변

다음과 같이를 MemoryStream대신 사용하십시오 FileStream.

MemoryStream ms = new MemoryStream();
bmp.Save (ms, ImageFormat.Jpeg);
byte[] bmpBytes = ms.ToArray();


답변

다음을 시도하십시오 :

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[]));