이미지를 바이트 배열로 변환하는 방법


125

아무도 이미지를 바이트 배열로 또는 그 반대로 변환하는 방법을 제안 할 수 있습니까?

WPF 애플리케이션을 개발 중이며 스트림 리더를 사용하고 있습니다.

답변:


175

이미지를 바이트 배열로 변경하는 샘플 코드

public byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
   using (var ms = new MemoryStream())
   {
      imageIn.Save(ms,imageIn.RawFormat);
      return  ms.ToArray();
   }
}

C # 이미지-바이트 배열 및 바이트 배열-이미지 변환기 클래스


12
대신 System.Drawing.Imaging.ImageFormat.Gif사용할 수 있습니다imageIn.RawFormat
S.Serpooshan

1
이것은 반복 할 수없는 것처럼 보이거나 적어도 몇 번의 변환 후에 이상한 GDI + 오류가 발생하기 시작합니다. ImageConverter아래에서 확인할 솔루션은 이러한 오류를 방지하기 위해 보인다.
Dave Cousineau

오늘날 png를 사용하는 것이 더 나을 수 있습니다.
Nyerguds

참고 : 여기에는 원하지 않는 추가 메타 데이터가 포함될 수 있습니다. ;-) 메타 데이터를 제거하려면 새 비트 맵 을 만들고 이미지 를 전달하는 것이 (new Bitmap(imageIn)).Save(ms, imageIn.RawFormat);좋습니다.
Markus Safar

56

이미지 개체를로 변환하려면 byte[]다음과 같이 할 수 있습니다.

public static byte[] converterDemo(Image x)
{
    ImageConverter _imageConverter = new ImageConverter();
    byte[] xByte = (byte[])_imageConverter.ConvertTo(x, typeof(byte[]));
    return xByte;
}

4
Perfect Answer! .... "이미지 파일 확장자"를 정의 할 필요가 없습니다. 정확히 제가 찾고 있던 것입니다.
Bravo

1
참고 : 여기에는 원하지 않는 추가 메타 데이터가 포함될 수 있습니다. ;-) 메타 데이터를 제거하려면 새 비트 맵 을 만들고 이미지 를 전달하는 것이 .ConvertTo(new Bitmap(x), typeof(byte[]));좋습니다.
Markus Safar

1
나를 위해 Visual Studio는 ImageConverter 유형을 인식하지 못합니다. 이것을 사용하는 데 필요한 import 문이 있습니까?
technoman23

32

이미지 경로에서 바이트 배열을 얻는 또 다른 방법은

byte[] imgdata = System.IO.File.ReadAllBytes(HttpContext.Current.Server.MapPath(path));

그들의 질문은 WPF (서버에서 실행 중이고 MapPath를 포함한다고 생각할 이유가 없음)이며 이미 이미지가 있음을 보여줍니다 (디스크에서 읽을 이유가없고 시작하기 위해 디스크에 있다고 가정하지도 않음). 죄송 합니다만 귀하의 답변은 질문과 전혀 관련이없는 것 같습니다
Ronan Thibaudau

19

여기 내가 현재 사용하고있는 것이 있습니다. 내가 시도한 다른 기술 중 일부는 픽셀의 비트 심도 (24 비트 대 32 비트)를 변경하거나 이미지 해상도 (dpi)를 무시했기 때문에 최적화되지 않았습니다.

  // ImageConverter object used to convert byte arrays containing JPEG or PNG file images into 
  //  Bitmap objects. This is static and only gets instantiated once.
  private static readonly ImageConverter _imageConverter = new ImageConverter();

이미지를 바이트 배열로 :

  /// <summary>
  /// Method to "convert" an Image object into a byte array, formatted in PNG file format, which 
  /// provides lossless compression. This can be used together with the GetImageFromByteArray() 
  /// method to provide a kind of serialization / deserialization. 
  /// </summary>
  /// <param name="theImage">Image object, must be convertable to PNG format</param>
  /// <returns>byte array image of a PNG file containing the image</returns>
  public static byte[] CopyImageToByteArray(Image theImage)
  {
     using (MemoryStream memoryStream = new MemoryStream())
     {
        theImage.Save(memoryStream, ImageFormat.Png);
        return memoryStream.ToArray();
     }
  }

이미지에 대한 바이트 배열 :

  /// <summary>
  /// Method that uses the ImageConverter object in .Net Framework to convert a byte array, 
  /// presumably containing a JPEG or PNG file image, into a Bitmap object, which can also be 
  /// used as an Image object.
  /// </summary>
  /// <param name="byteArray">byte array containing JPEG or PNG file image or similar</param>
  /// <returns>Bitmap object if it works, else exception is thrown</returns>
  public static Bitmap GetImageFromByteArray(byte[] byteArray)
  {
     Bitmap bm = (Bitmap)_imageConverter.ConvertFrom(byteArray);

     if (bm != null && (bm.HorizontalResolution != (int)bm.HorizontalResolution ||
                        bm.VerticalResolution != (int)bm.VerticalResolution))
     {
        // Correct a strange glitch that has been observed in the test program when converting 
        //  from a PNG file image created by CopyImageToByteArray() - the dpi value "drifts" 
        //  slightly away from the nominal integer value
        bm.SetResolution((int)(bm.HorizontalResolution + 0.5f), 
                         (int)(bm.VerticalResolution + 0.5f));
     }

     return bm;
  }

편집 : jpg 또는 png 파일에서 이미지를 가져 오려면 File.ReadAllBytes ()를 사용하여 파일을 바이트 배열로 읽어야합니다.

 Bitmap newBitmap = GetImageFromByteArray(File.ReadAllBytes(fileName));

이렇게하면 소스 스트림이 열린 상태로 유지되기를 원하는 Bitmap과 관련된 문제와 소스 파일이 잠긴 상태로 유지되는 문제에 대한 몇 가지 제안 된 해결 방법을 피할 수 있습니다.


이를 테스트하는 동안 결과 비트 맵을 가져 와서 다음을 사용하여 바이트 배열로 되돌릴 ImageConverter _imageConverter = new ImageConverter(); lock(SourceImage) { return (byte[])_imageConverter.ConvertTo(SourceImage, typeof(byte[])); } 것입니다 . 여기서 간헐적으로 두 가지 크기의 배열이 생성됩니다. 이것은 일반적으로 약 100 회 반복 후에 발생하지만 비트 맵을 사용하여 얻은 new Bitmap(SourceFileName);다음 해당 코드를 통해 실행하면 정상적으로 작동합니다.
Don

@ 돈 : 정말 좋은 아이디어가 없습니다. 어떤 이미지가 입력과 동일한 출력을 생성하지 않는지 일관성이 있습니까? 왜 다른지 알기 위해 예상과 다른 출력을 조사해 보셨습니까? 아니면 그다지 중요하지 않을 수도 있고 "일이 일어난다"는 것을 받아 들일 수도 있습니다.
RenniePet

일관되게 일어나고있었습니다. 그래도 원인을 찾지 못했습니다. 메모리 할당에서 4K 바이트 경계와 관련이 있다고 생각합니다. 그러나 그것은 쉽게 틀릴 수 있습니다. 저는 BinaryFormatter와 함께 MemoryStream을 사용하도록 전환했고 다양한 형식과 크기의 250 개 이상의 테스트 이미지로 테스트 한 결과 매우 일관성을 유지할 수 있었고 검증을 위해 1000 번 이상 반복되었습니다. 답장 해주셔서 감사합니다.
Don

17

이 시도:

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
    return ms.ToArray();
}

public Image byteArrayToImage(byte[] byteArrayIn)
{
    MemoryStream ms = new MemoryStream(byteArrayIn);
    Image returnImage = Image.FromStream(ms);
    return returnImage;
}

imageToByteArray (System.Drawing.Image imageIn) imageIn 이미지 경로 나 다른 어떤 우리가이에 이미지를 전달할 수있는 방법입니다
Shashank

이것은 이미지를 바이트 배열로 또는 그 반대로 변환해야 할 때마다 수행하는 작업입니다.
Alex Essilfie

당신은
메모리

1
@ Qwerty01 Dispose를 호출하면 MemoryStream적어도 현재 구현에서 사용되는 메모리가 더 빨리 정리되지 않습니다 . 실제로 닫으면 Image나중에 사용할 수 없으며 GDI 오류가 발생합니다.
Saeb Amini 2015

14

File.ReadAllBytes()메소드를 사용 하여 모든 파일을 바이트 배열로 읽을 수 있습니다 . 바이트 배열을 파일에 쓰려면 File.WriteAllBytes()메소드를 사용하십시오 .

도움이 되었기를 바랍니다.

여기에서 자세한 정보와 샘플 코드를 찾을 수 있습니다 .


참고 : 여기에는 원하지 않는 추가 메타 데이터가 포함될 수 있습니다. ;-)
Markus Safar

1
아마도. 나는 10 년 전에이 대답을 썼고, 그때는 더 신선하고 멍청했다.
Shekhar

5

픽셀 또는 전체 이미지 (헤더 포함) 만 바이트 배열로 원하십니까?

픽셀의 경우 : CopyPixels비트 맵 에서 방법을 사용합니다 . 다음과 같은 것 :

var bitmap = new BitmapImage(uri);

//Pixel array
byte[] pixels = new byte[width * height * 4]; //account for stride if necessary and whether the image is 32 bit, 16 bit etc.

bitmap.CopyPixels(..size, pixels, fullStride, 0); 

3

암호:

using System.IO;

byte[] img = File.ReadAllBytes(openFileDialog1.FileName);

1
만 그 파일을 읽는 경우 작업 (심지어 그는 얻는 형식 / 압축 바이트가 아닌 원료 것 자사의 BMP하지 않는 한)
BradleyDotNET

3

스트림에서 바이트를 전달하기 위해 imageBytes를 참조하지 않으면 메서드가 아무것도 반환하지 않습니다. imageBytes = m.ToArray (); 참조하십시오.

    public static byte[] SerializeImage() {
        MemoryStream m;
        string PicPath = pathToImage";

        byte[] imageBytes;
        using (Image image = Image.FromFile(PicPath)) {

            using ( m = new MemoryStream()) {

                image.Save(m, image.RawFormat);
                imageBytes = new byte[m.Length];
               //Very Important    
               imageBytes = m.ToArray();

            }//end using
        }//end using

        return imageBytes;
    }//SerializeImage

[주의] 그래도 브라우저에 이미지가 표시되지 않으면 자세한 문제 해결 단계를 작성했습니다.

해결되었습니다! -iis-not-serving-css, -images-and-javascript


1

모든 유형 (예 : PNG, JPG, JPEG)의 이미지를 바이트 배열로 변환하는 코드입니다.

   public static byte[] imageConversion(string imageName){            


        //Initialize a file stream to read the image file
        FileStream fs = new FileStream(imageName, FileMode.Open, FileAccess.Read);

        //Initialize a byte array with size of stream
        byte[] imgByteArr = new byte[fs.Length];

        //Read data from the file stream and put into the byte array
        fs.Read(imgByteArr, 0, Convert.ToInt32(fs.Length));

        //Close a file stream
        fs.Close();

        return imageByteArr
    }

참고 : 여기에는 원하지 않는 추가 메타 데이터가 포함될 수 있습니다. ;-)
Markus Safar

0

이미지를 바이트 배열로 변환하려면 코드는 다음과 같습니다.

public byte[] ImageToByteArray(System.Drawing.Image images)
{
   using (var _memorystream = new MemoryStream())
   {
      images.Save(_memorystream ,images.RawFormat);
      return  _memorystream .ToArray();
   }
}

To be convert the Byte array to Image. 코드는 아래와 같습니다. 코드는 A Generic error occurred in GDI+Image Save에서 핸들 입니다.

public void SaveImage(string base64String, string filepath)
{
    // image convert to base64string is base64String 
    //File path is which path to save the image.
    var bytess = Convert.FromBase64String(base64String);
    using (var imageFile = new FileStream(filepath, FileMode.Create))
    {
        imageFile.Write(bytess, 0, bytess.Length);
        imageFile.Flush();
    }
}

-2

이 코드는 SQLSERVER 2012의 테이블에서 처음 100 개 행을 검색하고 행당 그림을 로컬 디스크에 파일로 저장합니다.

 public void SavePicture()
    {
        SqlConnection con = new SqlConnection("Data Source=localhost;Integrated security=true;database=databasename");
        SqlDataAdapter da = new SqlDataAdapter("select top 100 [Name] ,[Picture] From tablename", con);
        SqlCommandBuilder MyCB = new SqlCommandBuilder(da);
        DataSet ds = new DataSet("tablename");
        byte[] MyData = new byte[0];
        da.Fill(ds, "tablename");
        DataTable table = ds.Tables["tablename"];
           for (int i = 0; i < table.Rows.Count;i++ )               
               {
                DataRow myRow;
                myRow = ds.Tables["tablename"].Rows[i];
                MyData = (byte[])myRow["Picture"];
                int ArraySize = new int();
                ArraySize = MyData.GetUpperBound(0);
                FileStream fs = new FileStream(@"C:\NewFolder\" + myRow["Name"].ToString() + ".jpg", FileMode.OpenOrCreate, FileAccess.Write);
                fs.Write(MyData, 0, ArraySize);
                fs.Close();
               }

    }

참고 : NewFolder 이름을 가진 디렉토리 는 C : \에 있어야합니다.


3
당신은 잘못된 질문에 대답 ... 음, 나는 희망 ^ _ ^
JiBéDoublevé
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.