chuyển đổi một chuỗi 64 cơ sở thành một hình ảnh và lưu nó


132

Đây là mã của tôi:

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();
            }
        }
}

Phần khai báo imageUrl trên cùng đang lấy một chuỗi hình ảnh Base64 và tôi muốn chuyển đổi nó thành một hình ảnh. Tôi nghĩ rằng bộ mã của tôi chỉ hoạt động đối với các hình ảnh như "www.mysite.com/test.jpg" không dành cho chuỗi Base64. Bất cứ ai có một số gợi ý? Cảm ơn!

Câu trả lời:


218

Dưới đây là một ví dụ, bạn có thể sửa đổi phương thức để chấp nhận tham số chuỗi. Sau đó, chỉ cần lưu đối tượng hình ảnh với 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;
}

Có thể nhận được một ngoại lệ A generic error occurred in GDI+.khi các byte đại diện cho một bitmap. Nếu điều này xảy ra, hãy lưu hình ảnh trước khi xử lý luồng bộ nhớ (trong khi vẫn ở trong câu lệnh sử dụng).


Phương pháp này cho tôi hình chữ nhật màu đen, bạn có ý kiến ​​gì không?
katmanco

54
Có, đây là một pixel đen: R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw ==
CRice

6
@katmanco Tôi sẽ nghĩ rằng pixel đen được cung cấp làm ví dụ. Hãy thử thay thế chuỗi base64 ví dụ bằng chuỗi base64 của riêng bạn
kallotec

2
Bạn có thể cần thêm một tham chiếu đến System.Drawing DLL
Philip Rego

1
@Bibin bạn đã thử lưu hình ảnh bên trong câu lệnh bằng cách sử dụng chưa?
CRice

83

Bạn có thể lưu Base64 trực tiếp vào tập tin:

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

Đây là một giải pháp tuyệt vời trong trường hợp tôi đang sử dụng mono trên Linux và gặp một số hành vi kỳ quặc với gdi + trong Image.Save. Giải pháp này hoàn toàn bỏ qua Image / Gdi + (Xem stackoverflow.com/questions353783690/iêu )
Jeff Albrecht

1
Tôi đã thử cả giải pháp này và @ CRice (sử dụng Image.Save()). Cả hai đều hoạt động, nhưng vì một số lý do, phiên bản này làm cho kích thước tệp của tôi nhỏ hơn 30% mà không có sự thay đổi rõ rệt về chất lượng hình ảnh
Brad Mathews

31

Đây là những gì tôi đã kết thúc với.

    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
Điều này đã cho tôi một lỗi A generic error occurred in GDI+được mô tả ở đây . Di chuyển image.Savebên trong khối sử dụng cố định nó cho tôi.
JumpingJezza

11

Tôi sẽ đề xuất qua Bitmap:

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
sự khác biệt giữa chuyển đổi qua bitmap hoặc không có bitmap là gì? thx
Amin Đà.

6

Trong trường hợp của tôi, nó chỉ hoạt động với hai dòng mã. Kiểm tra mã C # dưới đây:

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

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

Đó là nó. Vui lòng bỏ phiếu nếu bạn thực sự tìm thấy giải pháp này hiệu quả với bạn. Cảm ơn trước.


1
Đó là bản sao câu trả lời của tôi (xem bên dưới stackoverflow.com/a353160048/4190593 ) :)
INT_24h

-1 vì dirPathphải có @dấu trước chuỗi i..e. @"C:\myfolder\"hoặc bạn phải thoát khỏi dấu gạch chéo ngược trong chuỗi, tức là"C:\\myfolder\\"
Marcus Parsons

bạn nên cung cấp tài liệu tham khảo cho câu trả lời khác đó thay vì lấy toàn bộ tín dụng ....
Arshi

6

Đây là mã làm việc để chuyển đổi một hình ảnh từ chuỗi base64 sang một Imageđối tượng và lưu trữ nó trong một thư mục có tên tệp duy nhất:

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

Trong một kịch bản tương tự, những gì làm việc cho tôi là như sau:

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

ImageTagId là ID của thẻ hình ảnh ASP.


5

Nếu bạn có một chuỗi dữ liệu nhị phân được mã hóa Base64, bạn sẽ có thể thực hiện các thao tác sau:

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

Bạn sẽ có thể ghi mảng kết quả vào một tệp.


Điều này không hoạt động. Nó chỉ chuyển đổi chuỗi base64 thành tương đương nhị phân của nó. Viết nó vào một tệp có phần mở rộng hình ảnh không làm cho nó thành một hình ảnh.
elliotwesoff

1
Không? Tôi xin lỗi, điều này không chính xác . Chuyển đổi một chuỗi Base64 thành tương đương nhị phân của nó không làm cho nó thành một hình ảnh. (Cảm ơn @elliotwesoff đã chỉ ra điều đó!) Và, tại sao bạn lại đề cập đến dữ liệu nhị phân ? Câu hỏi này không có cách nào đề cập đến nhị phân , hoặc thậm chí làm thế nào để chuyển đổi nó.
Momoro

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
Mặc dù mã này có thể giải quyết vấn đề của OP, tốt nhất là bao gồm một lời giải thích về cách mã của bạn giải quyết vấn đề của OP. Theo cách này, khách truy cập trong tương lai có thể học hỏi từ bài đăng của bạn và áp dụng nó vào mã của riêng họ. SO không phải là một dịch vụ mã hóa, mà là một nguồn tài nguyên cho kiến ​​thức. Ngoài ra, chất lượng cao, câu trả lời đầy đủ có nhiều khả năng được nâng cao. Các tính năng này, cùng với yêu cầu tất cả các bài đăng đều khép kín, là một số điểm mạnh của SO như một nền tảng, khác biệt với các diễn đàn. Bạn có thể chỉnh sửa để thêm thông tin bổ sung & / hoặc để bổ sung giải thích của bạn với tài liệu nguồn.
ysf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.