web-dev-qa-db-ja.com

base 64文字列を画像に変換して保存する

ここに私のコードがあります:

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」のような画像に対してのみ機能すると思います。誰か提案がありますか?ありがとう!

107
anthonypliu

次に例を示します。文字列パラメーターを受け入れるようにメソッドを変更できます。次に、.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ステートメント内にある間に)イメージを保存します。

178
CRice

Base64をファイルに直接保存できます。

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

ここに私が行き着いたものがある。

    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);
    }
29
Austin

私はビットマップ経由で提案します:

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

私の場合、2行のコードでのみ機能します。以下のC#コードをテストします。

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

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

それでおしまい。この解決策が本当に役立つと思ったら、ぜひ投票してください。前もって感謝します。

6
Milan Sheth

Base64でエンコードされたバイナリデータの文字列がある場合、次のことができるはずです。

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

結果の配列をファイルに書き込むことができるはずです。

5
afranz409

同様のシナリオで、私のために働いたのは次のとおりでした:

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

ImageTagIdは、ASPイメージタグのIDです。

4
abhishek

以下は、画像を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();
    }
}
3
Yogesh Bhokare