(パスで選択された)画像をbase64文字列に変換する


111

ユーザーのコンピューター上のパスからC#でbase64文字列に画像を変換するにはどうすればよいですか?

たとえば、画像へのパス(形式C:/image/1.gif)がありdata:image/gif;base64,/9j/4AAQSkZJRgABAgEAYABgAAD..1.gif返された画像を表すようなデータURIが必要です。


それらをCSSに埋め込む場合は、このタスクを処理できる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 2018年

@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
@スミス、もしあなたがbase64から戻って変換するつもりなら、あなたはSystem.Drawing.Imagestを使うことができます。このように:var img = Image.FromStream(new MemoryStream(Convert.FromBase64String(base64String)));
Arin Ghazarian 2014年

27

私たちのほとんどはワンライナーが好きなので、

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の回答とどう違うのですか?
ルフィン

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.Mappathを使用して相対パスを指定し、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

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を画像ソースとして配置する必要はありません。通常のパスで十分です。あなたが直面している問題は何ですか?
エーサン、2014年

6
これにより、ファイル名がイメージ自体ではなくbase64に変換されます。
Olivier Jacot-Descombes 2016

-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.