c# - 我无法使用Image to Base64 String函数

标签 c# image sockets client-server base64

我正在制作多客户端聊天服务器(完成)。

但我想添加图像发送。
我在发送消息时使用了这种方法
client1写入消息和getbyte->服务器-> getstring

所以我这样编码(我不能写这部分)
加载图像-> ImageToBase64(image)-> getbyte->服务器-> getstring-> Base64ToImage
客户发送部分

我如何使用此功能,可以运行此方法。

 private void button1_Click(object sender, EventArgs e)
 {
    Image screen;
    screen=Image.FromFile("C:\\Users\\User\\Desktop\\Paint.bmp");
    screentext = ImageToBase64(screen); //actually I do not know what parameter should be here

    StreamWriter wrthr = new StreamWriter(@"C:\Users\User\Desktop\giden.txt");
    wrthr.Write(screentext); 
    wrthr.Close(); // result empty txt
    }




public string ImageToBase64(Image image, System.Drawing.Imaging.ImageFormat format)
{
  using (MemoryStream ms = new MemoryStream())
  {
    // Convert Image to byte[]
    image.Save(ms, format);
    byte[] imageBytes = ms.ToArray();

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


public Image Base64ToImage(string base64String)
{
  // Convert Base64 String to byte[]
  byte[] imageBytes = Convert.FromBase64String(base64String);
  MemoryStream ms = new MemoryStream(imageBytes, 0, 
    imageBytes.Length);

  // Convert byte[] to Image
  ms.Write(imageBytes, 0, imageBytes.Length);
  Image image = Image.FromStream(ms, true);
  return image;
}

最佳答案

编辑:这里有两个问题...

ImageToBase64选择第二个参数

由您决定-您是否要将其保存为BMP文件?如果是这样,您根本就不需要通过Image ...只需从Paint.bmp加载字节,然后将它们直接转换为Base64即可:

byte[] bytes = File.ReadAllBytes(@"C:\Users\User\Desktop\Paint.bmp");
File.WriteAllText(@"C:\Users\User\Desktop\giden.txt",
                  Convert.ToBase64String(bytes));

或者您可能希望选择其他格式,例如PNG或JPEG,例如
string screentext = ImageToBase64(screen, ImageFormat.Png);

(目前尚不清楚screentext的声明位置,但是几乎可以肯定它应该是局部变量。)

从base64转换...

这就是问题:
MemoryStream ms = new MemoryStream(imageBytes, 0, 
  imageBytes.Length);

// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);

您不需要Write调用,这在这里非常有害:
  • 您已经使用MemoryStream构造了imageBytes,因此它已经包含了该数据
  • 通过写入流,您已经将“光标”移动到了最后...因此,无需阅读

  • 只需使用:
    public Image Base64ToImage(string base64String)
    {
      // Convert Base64 String to byte[]
      byte[] imageBytes = Convert.FromBase64String(base64String);
      MemoryStream ms = new MemoryStream(imageBytes);
      return Image.FromStream(ms, true);
    }
    

    关于c# - 我无法使用Image to Base64 String函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17907608/

    相关文章:

    java - 条件三元与对数据库的方法调用

    c# - System.IdentityModel.Tokens.JwtSecurityToken 自定义属性

    java - 为什么我无法使用 Graphics drawString 方法可视化字符串

    c++ - 使用 TCP 套接字(WIN32 API)创建的两个窗口之间的通信

    multithreading - Haskell - 线程时缓慢的套接字连接

    c++ - 如何在 C 套接字上将超时设置为 "connect()"函数?

    c# - 线程休眠函数无响应

    c# - 创建新范围时添加范围服务

    ios - 如何在不更改 iOS 中的图像的情况下删除 imageview 上的绘图?

    java - 下载并保存图形