경로로 선택한 이미지를 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.