0

我有一个用例需要渲染位图拼贴作为预览。该应用程序实现为基于 MVC 的 REST 服务,我有一个相当普通的实现:

using (var bitmap = new Bitmap((int)maxWidth, (int)maxHeight))
{
using (var graphic = Graphics.FromImage(bitmap))
{
    graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;

    // now again for each mod
    foreach (var mod in mods)
    {
        var frame = frames.First(f => f.Index == mod.FrameIndex);
        var fileInfo = GetFileInfo(mod);
        using (var modImage = Image.FromFile(fileInfo.FullName))
        {
            graphic.DrawImage(modImage, (int)frame.Left, (int)frame.Top);
        }
    }

    bitmap.Save(previewFileName);
}
}

虽然这段代码运行良好,但性能却很差(尤其是较大的图像)。我也愿意使用第三方库,我只需要一个性能更快的解决方案。

任何帮助将不胜感激。

更新

为了阐明用例,缓存无济于事。这些图像由客户上传,然后他们请求预览所选拼贴。将图像写入拼贴画很慢。

4

3 回答 3

1

我刚刚意识到您正在以原始大小绘制 modImages(因为您使用的覆盖仅需要左坐标和上坐标)。如果这就是你想要的,你也可以使用图形类的 DrawImageUnscaled()-Method,这应该更快:

    var frame = frames.First(f => f.Index == mod.FrameIndex);
    var fileInfo = GetFileInfo(mod);
    using (var modImage = Image.FromFile(fileInfo.FullName))
    {
        graphic.DrawImageUnscaled(modImage, (int)frame.Left, (int)frame.Top);
    }
于 2013-08-31T16:00:41.593 回答
0

如果你有一个静态数量的缩略图,类似于 Netflix,我会在内存中创建一个缓存来保存缩略图位图。这甚至可以是一个静态对象。生成缩略图后,您无需再次生成它。这比每次都试图找到一个更快的锤子来敲击它是一种更清洁的方法。

例子 :

if(MyThumbnailImageDictionary["whateverimageId"] != null)
   return (Bitmap)MyThumbnailImageDictionary["whateverimageId"];

如果缩略图是动态的,例如来自用户上传随机图片,那么这种方法将无济于事,因为图像缓存的大小将变得巨大。

您可以使用以下代码生成缩略图,但我不确定它会快多少:

 Image image = Image.FromFile(fileName);
 Image thumb = image.GetThumbnailImage(120, 120, ()=>false, IntPtr.Zero);
于 2013-08-27T23:31:32.973 回答
0

画质有多重要?如果您需要更快的结果,您应该尝试 InterpolationMode.NearestNeighbour,这应该会快得多,但结果会相当低质量。HeighQualityBicubic(您当前使用的)产生最佳结果,但性能最低。

于 2013-08-27T22:29:17.027 回答