【发布时间】: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