【问题标题】:Image.FromStream throws Parameter is not valid error only on linuxImage.FromStream throws Parameter is not valid error only on linux
【发布时间】:2021-06-23 03:52:47
【问题描述】:

我在 .net 核心中进行了一些单元测试,检查从 Angular 前端上传的文件是否实际上在后端调整了大小。

我有一个用于测试的服务,包含以下方法:

public byte[] ResizeImage(IFormFile formFile)
    {
        Image imgFromStream;
        using (var memStream = new MemoryStream())
        {
            formFile.CopyTo(memStream);
            memStream.Position = 0;

            Console.WriteLine("$$$$$$$ LENGTH  :" + memStream.Length);
            Console.WriteLine("$$$$$$$ CAN READ :" + memStream.CanRead);
          

   
 ->>>>>           imgFromStream = System.Drawing.Image.FromStream(memStream, false,false);

            Image thumbnail = imgFromStream.GetThumbnailImage(280, 90, () => false, IntPtr.Zero);

            var imageByteArray = new byte[0];

            using (MemoryStream mStream = new MemoryStream())
            {
                thumbnail.Save(mStream, ImageFormat.Png);
                imageByteArray = mStream.ToArray();
            }
            imgFromStream.Dispose();
            thumbnail.Dispose();
            return imageByteArray;
        }

    }

问题在于,只有在 Linux 机器上,测试才会从带有 (---->>>) 的行中失败。 我已经尝试过使用 ImageConverter,linux 对此也有不好的看法,但它仍然无法正常工作。 我没有想法。

StackTrace :   at System.Drawing.Image.InitializeFromStream(Stream stream)
at System.Drawing.Image.LoadFromStream(Stream stream, Boolean keepAlive)
at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)

为测试创建图像的方法:

 public Image ByteArrayToImage(byte[] byteArrayIn)
    {
        int size = (int)Math.Sqrt(byteArrayIn.Length);

        Bitmap bitmap = new Bitmap(size, size, PixelFormat.Format32bppArgb);
        BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);

        try
        {
            for (int rowIndex = 0; rowIndex < bitmapData.Height; ++rowIndex)
                Marshal.Copy(byteArrayIn, rowIndex * bitmap.Width, bitmapData.Scan0 + rowIndex * bitmapData.Stride, bitmap.Width);
        }
        finally
        {
            bitmap.UnlockBits(bitmapData);
        }

        return bitmap;
    }

并生成byteArrayIn参数:

     private byte[] GenerateImageByteArray(int sizeInMb)
    {
        Random rnd = new Random();


        Byte[] b = new Byte[sizeInMb * 1024 * 1024]; // convert mb to byte
        rnd.NextBytes(b);

        //This conversion is needed because the GetThumbnail method from the Service will throw an error
        //A random generated byte array can not be converted into a thumbnail
        //Only if it's from an image
        var image = ByteArrayToImage(b);
        var imageByteArray = new byte[0];
        using (MemoryStream mStream = new MemoryStream())
        {
            image.Save(mStream, ImageFormat.Png);
            imageByteArray=mStream.ToArray();
        }

        return imageByteArray;
    }

【问题讨论】:

    标签: c# linux image asp.net-core file-upload


    【解决方案1】:

    如果你想在 linux 上使用System.Drawing.Common,你需要安装 GDI+ 支持库:

    sudo apt install libc6-dev 
    sudo apt install libgdiplus
    

    【讨论】:

    • 现在我的内存不足了。在 System.Drawing.Image.InitializeFromStream(Stream 流)
    • 查看this issue,该文件可能不是有效图像。
    • 你能看到我更新的问题吗?我已经添加了图像生成方法
    • 您是从随机生成的字节创建图像吗?它可以在 Windows 上运行吗?
    猜你喜欢
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多