【问题标题】:Image from Base64 to Image从 Base64 到 Image
【发布时间】:2017-07-13 05:04:13
【问题描述】:

我要求用户上传一张图片,可以是任何图片格式。

我将 base64 数据以及文件名传递给我的 .Net 控制器(从中我可以获取扩展名)。

然后我将该 base64 字符串转换为图像。

    public static Image Base64ToImage(string base64String)
    {

        // Convert base 64 string to byte[]
        byte[] imageBytes = Convert.FromBase64String(base64String);
        // Convert byte[] to Image
        using (var ms = new MemoryStream(imageBytes, 0, imageBytes.Length))
        {
            Image image = Image.FromStream(ms, true);
            return image;
        }
    }

我收到一个错误:

输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非法字符

我认为是因为base54字符串有:

"data:image/jpeg;base64,/9j/4AAQSkZJRgABA ...." 开头。

所以我需要剪掉“data:image/jpeg;base64”,然后保存?当我要删除有关文件类型的数据时,是否需要在其他地方指定它?

我发现的所有示例似乎都没有从前面修剪任何内容。他们只是保存字符串。我猜,我这边的东西正在添加那个标题?

【问题讨论】:

  • 只需删除data:image/jpeg;base64,,您可以在将图像保存到文件系统时指定类型。
  • 谢谢。图像正在发送到数据库(因此,稍后将转换为 byte[])。我是否需要将文件类型保存到数据库中,这样当我读回它时,我知道要读回它的格式?
  • 为什么不想将base64 保存为 blob?
  • 这听起来是个好主意。我可以将 base64 保存为 VarBinary 吗?我还需要修剪 jpeg 标题吗?

标签: c# image


【解决方案1】:

您好,请找到我过去一直使用的工作转换器版本, 请告诉您是否需要更多解释。

看来你转换到 base64 是罪魁祸首!

       /// <summary>
    ///1 Convert String to Image
    /// </summary>
    /// <param name="commands"></param>
    /// <returns></returns>

    public Image ConvertStringtoImage(string commands)
    {

        byte[] photoarray = Convert.FromBase64String(commands);
        MemoryStream ms = new MemoryStream(photoarray, 0, photoarray.Length);
        ms.Write(photoarray, 0, photoarray.Length);
        Image image = System.Drawing.Image.FromStream(ms);
        return image;

    }


    /// <summary>
    ///2. Read picture from Database and return as image
    /// just change the mysql to sql server type.
    /// </summary>
    /// <param name="commands"></param>
    /// <returns></returns>

    public Image Readphotofromdb(string commands)
    {
        Image image = null;
        using (MySqlConnection dbConn = new MySqlConnection(connector))
        {
            using (MySqlCommand cmd = new MySqlCommand(commands, dbConn))
            {
                dbConn.Open();
                using (MySqlDataReader reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        byte[] photoarray = Convert.FromBase64String(reader.GetString(0));
                        MemoryStream ms = new MemoryStream(photoarray, 0, photoarray.Length);
                        ms.Write(photoarray, 0, photoarray.Length);
                        image = new Bitmap(ms);

                    }
                }
            }
        }
        MySqlConnection.ClearAllPools();
        return image;

    }

    /// <summary>
    /// 3. Convert Image to base64 string
    /// </summary>
    /// <param name="image"></param>
    /// <returns></returns>


    public string ConvertImageToString(Image image)
    {
        byte[] byteArray = new byte[0];
        using (MemoryStream stream = new MemoryStream())
        {
            image.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
            stream.Close();
            byteArray = stream.ToArray();
        }
        string base64String = Convert.ToBase64String(byteArray);
        return base64String;
    }

【讨论】:

    【解决方案2】:

    使用图像数据,例如 /9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQ......9= 代替 数据:图像/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQ.. ....9=

     private void GetImage(){
      string imagedata="/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQ.. 
       ....9=";
      Image image=ImageFromBase64(imagedata);
    }
    public static Image ImageFromBase64(string base64String)
        {
                    
            byte[] imageBytes = Convert.FromBase64String(base64String);
             
            using (var ms = new MemoryStream(imageBytes, 0, imageBytes.Length))
            {
                Image image = Image.FromStream(ms, true);
                return image;
            }
        }
    

    【讨论】:

    • OP 已经尝试过了,他在问为什么会这样,以及他们是否需要处理丢失的部分。
    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2019-07-15
    相关资源
    最近更新 更多