【问题标题】:How do I convert a byte[] that holds a png image into a file to be saved on the filesystem?如何将保存 png 图像的 byte[] 转换为要保存在文件系统上的文件?
【发布时间】:2022-01-24 04:18:33
【问题描述】:

如何将保存 png 图像的 byte[] 转换为要保存在文件系统上的文件?

   using MemoryStream memoryStream = new 
   MemoryStream(response.Shipments[0].ShippingLabel);
   memoryStream.Position = 0;
   System.Drawing.Image image = System.Drawing.Image.FromStream(memoryStream);
   image.Save(@"C:\\Users\CS\Documents\FedexLabel.png", ImageFormat.Png);

上面的代码一直抛出这个错误:

    System.AggregateException
    HResult=0x80131500
    Message=One or more errors occurred. (Parameter is not valid.)
    Source=System.Private.CoreLib
    StackTrace:
    at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken 
    cancellationToken)
    at System.Threading.Tasks.Task.Wait()
    at ConsoleApp3.Program.Main(String[] args) in 

    This exception was originally thrown at this call stack:
    [External Code]
    Marketplace.FedexServices.FedexServicesTest.TestFedexCreateShipmentService() in 
    FedexServicesTest.cs

    Inner Exception 1:
    ArgumentException: Parameter is not valid.

【问题讨论】:

  • 路径中有双反斜杠。我不太确定这是否合法。
  • @bent-tranberg .Save 不会抛出ArgumentException,但System.Drawing.Image.FromStream(...) 会抛出,因此在这种情况下图像数据可能无效。
  • 仅供参考 File.WriteAllBytes 存在。我可能会用它来写它。如果您不能 100% 信任这些字节的来源,那么在写入之前检查它是否是有效图像可能仍然是个好主意。
  • 字节直接来自其他服务器。我应该使用 Convert.ToBase64() 吗? File.WriteAllBytes 会输出什么?
  • 你检查过这个链接吗? stackoverflow.com/questions/9173904/…

标签: c# asp.net asp.net-core


【解决方案1】:

我写了一个demo来把byte[]图片转成文件并保存。

管理 Nuget 包: System.Drawing.Common ;

public IActionResult Index(byte[] fileBytes)
        {
            
            //Convert byte type pictures into files to save
            var im = new System.IO.MemoryStream(fileBytes);
            var img = Image.FromStream(im);

            //save the file
            img.Save(@"C:\Users\CS\Documents\FedexLabel.png");
    

            //......

        }

【讨论】:

    【解决方案2】:

    我仍然使用这个代码

    byte[] image2 = response.Shipments[0].ShippingLabel.ToArray();
    MemoryStream memoryStream = new MemoryStream(image2);
    
    BinaryReader rd = new BinaryReader(memoryStream);
    
    string filename = "C:/Users/CS/Documents/FedexLabel.png";
    
    byte[] buffer = new byte[1024];
    FileStream outFile = new FileStream(filename, FileMode.Create);
    
    int bytesRead;
    
    while ((bytesRead = memoryStream.Read(buffer, 0, buffer.Length)) != 0)
        outFile.Write(buffer, 0, bytesRead);
    
    outFile.Close();
    

    【讨论】:

    • image2 写入文件需要大量冗余代码。您使用image2byte[])构造一个内存流,然后使用byte[] 在该内存流和输出文件之间复制 1kb 段。 outFile.Write(image2, 0, image2.Length); 有什么问题(或者只是 File.WriteAllBytes(filename, image2); 并跳过所有额外的流和数组?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2021-11-02
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多