기본 64 문자열을 이미지로 변환하여 저장


132

내 코드는 다음과 같습니다.

protected void SaveMyImage_Click(object sender, EventArgs e)
        {
            string imageUrl = Hidden1.Value;
            string saveLocation = Server.MapPath("~/PictureUploads/whatever2.png") ; 


            HttpWebRequest imageRequest = (HttpWebRequest)WebRequest.Create(imageUrl);
            WebResponse imageResponse = imageRequest.GetResponse();

            Stream responseStream = imageResponse.GetResponseStream();

            using (BinaryReader br = new BinaryReader(responseStream))
            {
                imageBytes = br.ReadBytes(500000);
                br.Close();
            }
            responseStream.Close();
            imageResponse.Close();

            FileStream fs = new FileStream(saveLocation, FileMode.Create);
            BinaryWriter bw = new BinaryWriter(fs);
            try
            {
                bw.Write(imageBytes);
            }
            finally
            {
                fs.Close();
                bw.Close();
            }
        }
}

상단 imageUrl 선언은 Base64 이미지 문자열을 가져 와서 이미지로 변환하고 싶습니다. 내 코드 세트는 Base64 문자열이 아닌 "www.mysite.com/test.jpg"와 같은 이미지에서만 작동한다고 생각합니다. 누구든지 제안이 있습니까? 감사!

답변:


218

다음은 문자열 매개 변수를 허용하도록 메서드를 수정할 수있는 예입니다. 그런 다음 image.Save (...)으로 이미지 객체를 저장하십시오 .

public Image LoadImage()
{
    //data:image/gif;base64,
    //this image is a single pixel (black)
    byte[] bytes = Convert.FromBase64String("R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw==");

    Image image;
    using (MemoryStream ms = new MemoryStream(bytes))
    {
        image = Image.FromStream(ms);
    }

    return image;
}

A generic error occurred in GDI+.바이트가 비트 맵을 나타내는 경우 예외가 발생할 수 있습니다 . 이런 일이 발생하면 메모리 스트림을 폐기하기 전에 이미지를 저장하십시오 (여전히 using 문 안에 있음).


이 방법은 나에게 검은 사각형을 제공합니다. 당신은 어떤 아이디어가 있습니까?
katmanco

54
예, 이것은 검은 색 픽셀입니다. R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw ==
CRice

6
@katmanco 나는 검은 픽셀이 예로서 제공되었다고 생각합니다. base64 문자열 예제를 자신의 base64 문자열로 바꾸십시오.
kallotec

2
System.Drawing DLL에 대한 참조를 추가해야 할 수도 있습니다.
Philip Rego

1
@Bibin using 문에 이미지를 저장하려고 했습니까?
CRice

83

Base64를 파일에 직접 저장할 수 있습니다.

string filePath = "MyImage.jpg";
File.WriteAllBytes(filePath, Convert.FromBase64String(base64imageString));

이것은 Linux에서 모노를 사용하고 Image.Save에서 gdi +와 함께 이상한 동작을 경험 한 경우에 탁월한 솔루션입니다. 이 솔루션은 Image / Gdi +를 완전히 우회합니다 ( stackoverflow.com/questions/35783690/… 참조 )
Jeff Albrecht

1
나는 이것과 @CRice의 솔루션을 모두 사용했다 Image.Save(). 둘 다 작동하지만 어떤 이유로 든이 버전은 이미지 품질을 눈에 띄게 변경하지 않고 파일 크기를 30 % 작게 만듭니다.
Brad Mathews

31

여기에 내가 끝내는 것이 있습니다.

    private void SaveByteArrayAsImage(string fullOutputPath, string base64String)
    {
        byte[] bytes = Convert.FromBase64String(base64String);

        Image image;
        using (MemoryStream ms = new MemoryStream(bytes))
        {
            image = Image.FromStream(ms);
        }

        image.Save(fullOutputPath, System.Drawing.Imaging.ImageFormat.Png);
    }

7
이것으로 여기에A generic error occurred in GDI+ 설명 된 오류가 발생 했습니다 . image.Saveusing 블록 내부를 움직이면 문제가 해결되었습니다.
JumpingJezza

11

비트 맵을 통해 제안합니다.

public void SaveImage(string base64)
{
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(base64)))
    {
        using (Bitmap bm2 = new Bitmap(ms))
        {
            bm2.Save("SavingPath" + "ImageName.jpg");
        }
    }
}

2
비트 맵을 통한 변환 또는 비트 맵없는 변환의 차이점은 무엇입니까? thx
아민 다.

6

필자의 경우 두 줄의 코드에서만 작동합니다. 아래 C # 코드를 테스트하십시오.

String dirPath = "C:\myfolder\";
String imgName = "my_mage_name.bmp";

byte[] imgByteArray = Convert.FromBase64String("your_base64_string");
File.WriteAllBytes(dirPath + imgName, imgByteArray);

그게 다야. 이 솔루션이 실제로 도움이된다면 친절하게 투표하십시오. 미리 감사드립니다.


1
내 답변의 사본입니다 (아래 stackoverflow.com/a/35160048/4190593 참조 ) :)
INT_24h

문자열 앞에 부호 dirPath가 있어야 하기 때문에 -1 또는 당신은 즉, 문자열에서 백 슬래시를 탈출해야@@"C:\myfolder\""C:\\myfolder\\"
마커스 파슨스

당신은 전체 신용을 얻는 대신 다른 답변에 대한 참조를 제공해야합니다 ....
Arshi

6

다음은 이미지를 base64 문자열에서 Image객체 로 변환하고 고유 한 파일 이름을 가진 폴더에 저장하는 작업 코드입니다 .

public void SaveImage()
{
    string strm = "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"; 

    //this is a simple white background image
    var myfilename= string.Format(@"{0}", Guid.NewGuid());

    //Generate unique filename
    string filepath= "~/UserImages/" + myfilename+ ".jpeg";
    var bytess = Convert.FromBase64String(strm);
    using (var imageFile = new FileStream(filepath, FileMode.Create))
    {
        imageFile.Write(bytess, 0, bytess.Length);
        imageFile.Flush();
    }
}

5

비슷한 시나리오에서 나를 위해 일한 것은 다음과 같습니다.

byte[] bytes = Convert.FromBase64String(Base64String);    
ImageTagId.ImageUrl = "data:image/jpeg;base64," + Convert.ToBase64String(bytes);

ImageTagId ASP 이미지 태그의 ID입니다.


5

Base64로 인코딩 된 이진 데이터 문자열이있는 경우 다음을 수행 할 수 있어야합니다.

byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData);

결과 배열을 파일에 쓸 수 있어야합니다.


작동하지 않습니다. 그냥 base64 문자열을 이진으로 변환합니다. 이미지 확장명을 가진 파일에이를 쓰면 이미지가되지 않습니다.
elliotwesoff

1
아니? 죄송합니다 . 잘못되었습니다 . Base64 문자열을 이진으로 변환 하면 이미지가되지 않습니다. (그것을 지적 해준 @elliotwesoff에게 감사합니다!) 그리고 바이너리 데이터 를 언급 하고 있습니까? 이 질문은 절대로 binary 또는 그것을 변환하는 방법을 언급하지 않습니다 .
모모로

0
public bool SaveBase64(string Dir, string FileName, string FileType, string Base64ImageString)
{
    try
    {
        string folder = System.Web.HttpContext.Current.Server.MapPath("~/") + Dir;
        if (!Directory.Exists(folder))
        {
            Directory.CreateDirectory(folder);
        }

        string filePath = folder + "/" + FileName + "." + FileType;
        File.WriteAllBytes(filePath, Convert.FromBase64String(Base64ImageString));
        return true;
    }
    catch
    {
        return false;
    }

}

2
이 코드는 OP 문제를 해결할 수 있지만 코드가 OP 문제를 해결하는 방법에 대한 설명을 포함하는 것이 가장 좋습니다. 이런 식으로, 미래 방문자는 귀하의 게시물에서 배우고 자신의 코드에 적용 할 수 있습니다. SO는 코딩 서비스가 아니라 지식을위한 리소스입니다. 또한 고품질의 완전한 답변이 상향 조정될 가능성이 높습니다. 이러한 기능은 모든 게시물이 자체적으로 포함되어야한다는 요구 사항과 함께 플랫폼으로서 SO의 강점 중 일부이며 포럼과 차별화됩니다. 추가 정보를 추가하거나 소스 문서로 설명을 보충하도록 편집 할 수 있습니다.
ysf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.