我在 dotnet core 下的 Azure 平台上的图像有点挣扎,我希望有人能提出明智的建议。前提很简单:用户上传图像,以base64格式保存在数据库中(即将移动到Azure存储blob,但这与此无关)。稍后,网站所有者出现并单击一个按钮以将所有这些图像保存在 ZIP 文件中。在过去的 .net 框架中,这很容易。现在我似乎在打一组“是的,但是”的评论。
是的,有 system.drawing.image 但你不能使用它,因为它不在 dotnet 核心中(直到最近)。是的,您可以使用 CoreCompat,但它在 Azure 上不起作用,因为在 Web 应用程序中不支持 GDI+。是的,即使我可以,我也在 Mac 上开发,所以据我所知,它不会在本地工作。
我已经尝试了 ImageSharp 的 beta4,但没有取得很大的成功。它是随机的 - 有时它有效,有时它只是抛出 OutOfMemoryException。我试过 SkiaSharp 但结果相似;有时它有效,有时它会吐出随机错误消息。
在处理方面,我没有做任何花哨的事情,没有调整大小或任何事情。应该是从 Convert.FromBase64String 加载文件到字节数组的情况,创建 Zip 文件入口,最终吐出 zip 文件。ZIP 部分很好,但我需要一些可以做图像工作的体面的东西。
这是一段代码:
if(!string.IsNullOrEmpty(del.Headshot))
{
var output=SKImage.FromBitmap(SKBitmap.Decode(Convert.FromBase64String(del.Headshot)));
MemoryStream savedFile=new MemoryStream();
output.Encode(SKEncodedImageFormat.Jpeg, 100).SaveTo(savedFile);
string name=$"{del.FirstName} {del.LastName} - {del.Company}".Trim(Path.GetInvalidFileNameChars()) + "_Headshot.jpg";
ZipArchiveEntry entry=zip.CreateEntry(name);
using(Stream entryStream=entry.Open())
{
entryStream.Write(savedFile.ToArray(), 0, Convert.ToInt32(savedFile.Length));
}
output.Dispose();
savedFile.Dispose();
}
在我拔出剩下的一点头发之前,谁能给我一个可以处理图像、跨平台和 Azure 的库的明智建议!
谢谢
编辑:第一个答案在技术上是正确的,我不需要其他任何东西。但是,当我说我没有进行任何图像处理时,我可能有点错误。因为它都是base64,没有文件名存储在任何地方,我不知道它是什么类型的文件。因此,我将每一个都保存为 JPEG,以确保我始终可以输出该文件类型和扩展名。我猜用户可能正在上传 JPG / PNG 甚至 GIF。