경로로 선택한 이미지를 base64 문자열로 변환


111

사용자 컴퓨터의 경로에서 C #의 base64 문자열로 이미지를 어떻게 변환합니까?

예를 들어, 이미지에 대한 경로 (형식 C:/image/1.gif)가 있고 반환 data:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..된 1.gif이미지를 나타내는 것과 같은 데이터 URI를 갖고 싶습니다 .


당신이 CSS로를 포함 할 거라면, 그런 당신을 위해이 작업을 처리 할 수 Gulp.js로 건설 장 시스템을 구성하는 방법에 대한 생각
— 콘스탄틴 Tarkus

2
경로 문자열을 인코딩하거나 해당 위치의 이미지를 데이터 URI로 지정 하시겠습니까?
— 마르셀

답변:


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 형식을 반환합니다. 따라서 실제 원본 파일의 바이트 대신 .Net 프레임 워크에 의해 gif에 다시 저장된 이미지의 바이트가 있다는 점을 제외하면 아무것도 변경되지 않습니다.
— Nyerguds

어떤 이유로 .Net은 애니메이션 GIF를 보지 못하며 팔레트 이미지로로드되며 ( 일부 png 유형 에서도 발생하지만 애니메이션 GIF에서만 발생 함 ) "하이 컬러"이미지를 팔레트 형식으로 다시 저장할 때 , 표준 Windows 256 색 팔레트를 사용합니다. 애니메이션 GIF에는 일반적으로 최적화 된 팔레트가 있기 때문에이 프로세스를 통해 저장된 모든 애니메이션 GIF의 품질이 끔찍하게 저하됩니다. 따라서이 설정은 확실히 이상적이지 않습니다. KansaiRobot의 답변에서 알 수 있듯이 원래 바이트를 읽는 것이 훨씬 낫습니다.
— Nyerguds

104

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)));
— 아린 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
이것은 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)하지만 MIME 유형으로서 데이터를 노출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 용으로 업데이트되었습니다. 다음은 기본적으로 사용할 수 있습니다. 명시 적으로 추가 System.Drawing하기 전에 Image하나 defaultly 다른 네임 스페이스의 클래스를 사용 될 수있다.

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=

base 64를 이미지 소스로 넣을 필요가 없습니다. 정상적인 경로이면 충분합니다. 당신이 직면하고있는 문제는 무엇입니까?
— Ehsan 2014 년

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.