답변:
이미지를 바이트 배열로 변경하는 샘플 코드
public byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
using (var ms = new MemoryStream())
{
imageIn.Save(ms,imageIn.RawFormat);
return ms.ToArray();
}
}
ImageConverter
아래에서 확인할 솔루션은 이러한 오류를 방지하기 위해 보인다.
(new Bitmap(imageIn)).Save(ms, imageIn.RawFormat);
좋습니다.
이미지 개체를로 변환하려면 byte[]
다음과 같이 할 수 있습니다.
public static byte[] converterDemo(Image x)
{
ImageConverter _imageConverter = new ImageConverter();
byte[] xByte = (byte[])_imageConverter.ConvertTo(x, typeof(byte[]));
return xByte;
}
.ConvertTo(new Bitmap(x), typeof(byte[]));
좋습니다.
이미지 경로에서 바이트 배열을 얻는 또 다른 방법은
byte[] imgdata = System.IO.File.ReadAllBytes(HttpContext.Current.Server.MapPath(path));
여기 내가 현재 사용하고있는 것이 있습니다. 내가 시도한 다른 기술 중 일부는 픽셀의 비트 심도 (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);
다음 해당 코드를 통해 실행하면 정상적으로 작동합니다.
이 시도:
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;
}
MemoryStream
적어도 현재 구현에서 사용되는 메모리가 더 빨리 정리되지 않습니다 . 실제로 닫으면 Image
나중에 사용할 수 없으며 GDI 오류가 발생합니다.
File.ReadAllBytes()
메소드를 사용 하여 모든 파일을 바이트 배열로 읽을 수 있습니다 . 바이트 배열을 파일에 쓰려면 File.WriteAllBytes()
메소드를 사용하십시오 .
도움이 되었기를 바랍니다.
여기에서 자세한 정보와 샘플 코드를 찾을 수 있습니다 .
픽셀 또는 전체 이미지 (헤더 포함) 만 바이트 배열로 원하십니까?
픽셀의 경우 : 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);
암호:
using System.IO;
byte[] img = File.ReadAllBytes(openFileDialog1.FileName);
스트림에서 바이트를 전달하기 위해 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
[주의] 그래도 브라우저에 이미지가 표시되지 않으면 자세한 문제 해결 단계를 작성했습니다.
모든 유형 (예 : 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
}
이미지를 바이트 배열로 변환하려면 코드는 다음과 같습니다.
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();
}
}
이 코드는 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 : \에 있어야합니다.
System.Drawing.Imaging.ImageFormat.Gif
사용할 수 있습니다imageIn.RawFormat