如何在保持比例的情况下调整图像的字节数组大小?

6
在我的ASP.Net MVC 4应用程序中,我有一个视图允许用户悬停在图像上以获取全尺寸预览。它运作良好。
目前,我将用户悬停的图像设置为静态宽度和高度为50和50,如下所示:
<img id="@Model.Value" class="image-preview" height="50" width="50" src="@Model.ImageString" />

@Model.ImageString 是由这个操作创建的一个值:

[HttpGet]
public string GetImageUrl(Guid fileId)
{
    var file = db.FetchedFiles
        .First(ff => ff.ID == fileId);

    return "data:image/*;base64," + Convert.ToBase64String(file.Data);
}

以下是我想修改的操作。如何将Convert.ToBase64String(file.Data)输出为与原始文件相同比例的缩略图?谢谢!
2个回答

12

我在网上找到了灵感,最终得出了这个:

string ResizeImage(byte[] data)
{
    using (var ms = new MemoryStream(data))
    {
        var image = Image.FromStream(ms);

        var ratioX = (double)150 / image.Width;
        var ratioY = (double)50 / image.Height;

        var ratio = Math.Min(ratioX, ratioY);

        var width = (int)(image.Width * ratio);
        var height = (int)(image.Height * ratio);

        var newImage = new Bitmap(width, height);

        Graphics.FromImage(newImage).DrawImage(image, 0, 0, width, height);

        Bitmap bmp = new Bitmap(newImage);

        ImageConverter converter = new ImageConverter();

        data = (byte[])converter.ConvertTo(bmp, typeof(byte[]));

        return "data:image/*;base64," + Convert.ToBase64String(data);
    }
}

ImageConverter是从哪里来的?我在System.Drawing中找不到它。 - Anuj
@Anuj 抱歉回复晚了,但这是我能提供的最佳资源。如果该类型在该命名空间中不存在,则您可能在环境中遇到了引用相关问题。https://learn.microsoft.com/en-us/dotnet/api/system.drawing.imageconverter?view=netframework-4.8 - keeehlan

0

您需要在服务器上返回一个已调整大小的新图片。

迄今为止,最简单的方法是使用 ImageResizing 并简单地传递文件流以及 ResizeSettings 来指定所需的尺寸。然后只需将调整大小后的文件作为base64返回即可。

该库非常广泛,并且有很好的文档和大量示例,因此您应该能够找到一个解决方案或调整一个方案以适合您的需求。

这是一个示例:http://imageresizing.net/docs/howto/upload-and-resize


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接