base 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画像文字列を取り込んでいるので、それを画像に変換したいと思います。私のコードセットは "www.mysite.com/test.jpg"のような画像でのみ機能し、Base64文字列では機能しないと思います。誰か提案がありますか?ありがとう!

回答:


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 2015年

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.Save使用ブロックの内側を移動すると修正されました。
JumpingJezza 2016

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

私の場合、2行のコードでのみ機能します。以下の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

-1 dirPath@、文字列の前に符号を付ける必要があるためです。@"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に感謝します!)そして、なぜバイナリデータについて言及しているのですか?この質問では、バイナリについても、変換方法についても触れられていません。
ももろ

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.