แปลงรูปภาพ (เลือกตามเส้นทาง) เป็นสตริง base64


111

คุณจะแปลงรูปภาพจากเส้นทางบนคอมพิวเตอร์ของผู้ใช้เป็นสตริง base64 ใน C # ได้อย่างไร

ตัวอย่างเช่นฉันมีเส้นทางไปยังรูปภาพ (ในรูปแบบC:/image/1.gif) และต้องการให้ URI ข้อมูลdata:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..เป็นตัวแทนของ1.gifรูปภาพที่ส่งคืน


หากคุณจะฝังลงใน CSS ลองนึกถึงการกำหนดค่าระบบ buil เช่น Gulp.js ซึ่งสามารถจัดการงานนี้ให้คุณได้
Konstantin Tarkus

2
คุณต้องการให้สตริงเส้นทางเข้ารหัสหรือรูปภาพ ณ ตำแหน่งนั้นให้ URI ข้อมูลหรือไม่?
Marcel

คำตอบ:


192

ลองทำตามนี้

using (Image image = Image.FromFile(Path))
{
    using (MemoryStream m = new MemoryStream())
    {
        image.Save(m, image.RawFormat);
        byte[] imageBytes = m.ToArray();

        // Convert byte[] to Base64 String
        string base64String = Convert.ToBase64String(imageBytes);
        return base64String;
    }
}

5
ทำไมถึงต้องกังวลกับการบันทึกใหม่ คุณสามารถอ่านไบต์ของไฟล์และแปลงไฟล์เหล่านั้นได้
Nyerguds

1
ในกรณีของฉันเป็นเพราะฉันต้องการปรับขนาดภาพหลังจากโหลดเสร็จแล้ว
pgee70

@Nyerguds ฉันคิดว่าเป็นเพราะมันต้องเป็นรูปแบบดิบที่ตัดสินโดยไฟล์image.RawFormat.
facepalm42

2
@ facepalm42 RawFormatไม่ใช่ตัวระบุรูปแบบภาพ เป็นคุณสมบัติของimageออบเจ็กต์ซึ่งจะส่งคืนรูปแบบที่รูปภาพอยู่เมื่ออ่านจากไฟล์ซึ่งหมายความว่าในกรณีนี้จะส่งคืนรูปแบบ gif ดังนั้นจึงไม่มีการเปลี่ยนแปลงใด ๆ ยกเว้นว่าแทนที่จะเป็นไบต์ของไฟล์ต้นฉบับจริงคุณมีไบต์ของรูปภาพที่บันทึกใหม่เป็น gif โดย. Net framework
Nyerguds

โปรดทราบว่าด้วยเหตุผลบางประการ. Net ไม่เห็น gif แบบเคลื่อนไหวที่โหลดเป็นภาพที่มีสีซีด (เกิดขึ้นกับ gif แบบเคลื่อนไหวเท่านั้นแม้ว่าจะเกิดขึ้นกับpng บางประเภทด้วยก็ตาม) และเมื่อบันทึกใหม่กล่าวว่ารูปภาพ "สีสูง" เป็นรูปแบบสีซีด มันใช้จานสีมาตรฐานของ Windows 256 เนื่องจาก gif แบบเคลื่อนไหวมักจะมีจานสีที่ปรับให้เหมาะสมแล้วหมายความว่า gif แบบเคลื่อนไหวใด ๆ ที่บันทึกผ่านกระบวนการนี้จะมีคุณภาพลดลงอย่างมาก ดังนั้นการตั้งค่านี้จึงไม่เหมาะอย่างยิ่ง การอ่านไบต์ดั้งเดิมจะดีกว่ามากตามที่คำตอบของ KansaiRobot แสดงให้เห็น
Nyerguds

105

รับการแทนค่า byte array ( byte[]) ของรูปภาพจากนั้นใช้Convert.ToBase64String()st. แบบนี้:

byte[] imageArray = System.IO.File.ReadAllBytes(@"image file path");
string base64ImageRepresentation = Convert.ToBase64String(imageArray);

ในการแปลงภาพ base4 กลับไปเป็น System.Drawing.Image:

var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));

3
@Smith ถ้าคุณหมายถึงแปลงกลับจาก base64 เป็นSystem.Drawing.Imageคุณสามารถใช้ st. ดังนี้var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian

27

เนื่องจากพวกเราส่วนใหญ่ชอบ oneliners:

Convert.ToBase64String(File.ReadAllBytes(imageFilepath));

หากคุณต้องการเป็นอาร์เรย์ Base64 ไบต์:

Encoding.ASCII.GetBytes(Convert.ToBase64String(File.ReadAllBytes(imageFilepath)));

22

แม้ว่าคำตอบที่ซับซ้อนกว่านั้นก็โอเค แต่ฉันพบว่าสิ่งนี้ดีกว่ามาก

var base64String= Convert.ToBase64String(File.ReadAllBytes(pathOfPic));

เป็นเรื่องง่ายคุณไม่จำเป็นต้องบันทึกใหม่และจัดการกับรูปแบบต่างๆ


1
สิ่งนี้แตกต่างจากคำตอบของ Ogglasจากปีก่อนหน้านี้อย่างไร?
ruffin

8

นี่คือคลาสที่ฉันเขียนขึ้นเพื่อจุดประสงค์นี้:

public class Base64Image
{
    public static Base64Image Parse(string base64Content)
    {
        if (string.IsNullOrEmpty(base64Content))
        {
            throw new ArgumentNullException(nameof(base64Content));
        }

        int indexOfSemiColon = base64Content.IndexOf(";", StringComparison.OrdinalIgnoreCase);

        string dataLabel = base64Content.Substring(0, indexOfSemiColon);

        string contentType = dataLabel.Split(':').Last();

        var startIndex = base64Content.IndexOf("base64,", StringComparison.OrdinalIgnoreCase) + 7;

        var fileContents = base64Content.Substring(startIndex);

        var bytes = Convert.FromBase64String(fileContents);

        return new Base64Image
        {
            ContentType = contentType,
            FileContents = bytes
        };
    }

    public string ContentType { get; set; }

    public byte[] FileContents { get; set; }

    public override string ToString()
    {
        return $"data:{ContentType};base64,{Convert.ToBase64String(FileContents)}";
    }
}

var base64Img = new Base64Image { 
  FileContents = File.ReadAllBytes("Path to image"), 
  ContentType="image/png" 
};

string base64EncodedImg = base64Img.ToString();

7

คุณสามารถผ่านเส้นทางของรูปภาพเพื่อดึงสตริง base64 ได้อย่างง่ายดาย

public static string ImageToBase64(string _imagePath)
    {
        string _base64String = null;

        using (System.Drawing.Image _image = System.Drawing.Image.FromFile(_imagePath))
        {
            using (MemoryStream _mStream = new MemoryStream())
            {
                _image.Save(_mStream, _image.RawFormat);
                byte[] _imageBytes = _mStream.ToArray();
                _base64String = Convert.ToBase64String(_imageBytes);

                return "data:image/jpg;base64," + _base64String;
            }
        }
    }

หวังว่านี่จะช่วยได้


ที่อาจทำให้เกิดปัญหาหากอินพุตเป็น gif; มันบันทึกอีกครั้งเป็นประเภทเดียวกัน (ตามที่ดึงมาจาก_image.RawFormat) แต่เปิดเผยข้อมูลเป็นประเภทละครใบ้image/jpg
Nyerguds

3

คุณสามารถใช้Server.Mapเส้นทางเพื่อให้เส้นทางสัมพัทธ์จากนั้นคุณสามารถสร้างรูปภาพโดยใช้base64การแปลงหรือคุณสามารถเพิ่มbase64สตริงเข้าไปimage srcก็ได้

byte[] imageArray = System.IO.File.ReadAllBytes(Server.MapPath("~/Images/Upload_Image.png"));

string base64ImageRepresentation = Convert.ToBase64String(imageArray);

1

วิธีนี้จะง่ายกว่าตรงที่คุณส่งภาพแล้วส่งรูปแบบ

private static string ImageToBase64(Image image)
{
    var imageStream = new MemoryStream();
    try
    {           
        image.Save(imageStream, System.Drawing.Imaging.ImageFormat.Bmp);
        imageStream.Position = 0;
        var imageBytes = imageStream.ToArray();
        var ImageBase64 = Convert.ToBase64String(imageBytes);
        return ImageBase64;
    }
    catch (Exception ex)
    {
        return "Error converting image to base64!";
    }
    finally
    {
      imageStream.Dispose;
    }
}

0

โค้ดต่อไปนี้ใช้ได้กับฉัน:

string image_path="physical path of your image";
byte[] byes_array = System.IO.File.ReadAllBytes(Server.MapPath(image_path));
string base64String = Convert.ToBase64String(byes_array);

0

จากคำตอบที่ได้รับการโหวตสูงสุดอัปเดตสำหรับ C # 8 ต่อไปนี้สามารถใช้งานได้นอกกรอบ เพิ่ม Explicit System.Drawingก่อนหน้าImageเนื่องจากอาจใช้คลาสนั้นจากเนมสเปซอื่นโดยปริยาย

public static string ImagePathToBase64(string path)
{
    using System.Drawing.Image image = System.Drawing.Image.FromFile(path);
    using MemoryStream m = new MemoryStream();
    image.Save(m, image.RawFormat);
    byte[] imageBytes = m.ToArray();
    tring base64String = Convert.ToBase64String(imageBytes);
    return base64String;
}

-3

คุณสามารถแปลงเป็นแบบนี้

  string test = @"C:/image/1.gif";
  byte[] bytes = System.Text.ASCIIEncoding.ASCII.GetBytes(test);
  string base64String = System.Convert.ToBase64String(bytes);
  Console.WriteLine("Base 64 string: " + base64String);

เอาต์พุต

  QzovaW1hZ2UvMS5naWY=

คุณไม่จำเป็นต้องใส่ฐาน 64 เป็นแหล่งที่มาของภาพ เส้นทางปกติก็น่าจะเพียงพอแล้ว ปัญหาที่คุณกำลังเผชิญคืออะไร?
Ehsan

6
สิ่งนี้จะแปลงชื่อไฟล์เป็น base64 แทนที่จะเป็นอิมเมจเอง
Olivier Jacot-Descombes

-3

อะไรแบบนั้น

 Function imgTo64(ByVal thePath As String) As String
    Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(thePath)
    Dim m As IO.MemoryStream = New IO.MemoryStream()

    img.Save(m, img.RawFormat)
    Dim imageBytes As Byte() = m.ToArray
    img.Dispose()

    Dim str64 = Convert.ToBase64String(imageBytes)
    Return str64
End Function

1
คุณสังเกตเห็นC#แท็กของคำถามหรือไม่
ADyson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.