【问题标题】:Black incomplete contents after image resized in C#在 C# 中调整图像大小后的黑色不完整内容
【发布时间】:2015-02-15 20:13:08
【问题描述】:

我正在使用 gfx.DrawImage 在我的 Azure 托管网站上生成用户上传图像的缩略图。

时不时地,其中一个缩略图随机包含一个大的黑色部分,几乎就像调整大小被中断且未完成一样。如果我再次重新生成相同的图像,它几乎总是在第二次尝试时生成得非常好(没有黑色部分)。所以这是一个非常随机的问题,只会偶尔发生,并且无法始终如一地重现。

这是一个例子:

原图:

http://naturemap.blob.core.windows.net/userimages-splash/30161.jpg

受影响的缩略图:

http://canberranaturemap.org/ImgSrvr?Id=30161&No=1&W=160&MinH=120&MaxH=120

这是我正在使用的代码,它在 99.9% 的时间都有效!

Bitmap newImage = new Bitmap(originalImage, FinalWidthPx, HeightPx);

using (Graphics gfx = Graphics.FromImage(newImage))
{
    gfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
    gfx.DrawImage(originalImage, 0, 0, newImage.Width, newImage.Height);
}

【问题讨论】:

  • 有没有OutOfMemoryException正在崛起?您是否有任何不会产生任何错误并且可能隐藏它们(或其他异常)的 try/catch?
  • 嗨,Jcl - 不,我不能说。我只是仔细检查了一下,我在任何地方都没有 try/catch 语句,而且在图像处理过程中我从未见过网页崩溃。我还检查了 Azure 日志,它说它没有 HTTP 服务器错误。嗯..
  • 那我不知道,你可能会尝试对此做一些压力测试,比如喂几千张图像(例如,制作一个没有任何黑色的测试原始图像并检查对于结果图像底部的某些像素为黑色)并查看问题出现的频率是否不是“那个”随机或类似的东西。
  • (顺便说一句,作为旁注 - 并且与问题无关 - 如果您使用 System.Drawing,并且除了缩放之外没有进行进一步处理,请检查 Image.GetThumbnailImage() 而不是将自己拉到使用Graphics的新位图)
  • 谢谢。我尝试了 Image.GetThumbnailImage() 并且一切正常,但是生成的图像质量非常低并且非常粗糙/模糊。我认为它只适用于非常小的尺寸图像。您的负载测试想法有优点,也许这个问题与服务器上的线程/争用有关,即使同时请求正在调用相同的库/代码......?

标签: c# image-processing graphics


【解决方案1】:

我按照您的指示设置了一个小负载测试页面,该页面基本上试图同时请求同一图像的 500 个动态调整大小的版本 :)

轰!!通过刷新该页面,我能够反复重现该问题。在不同的页面加载时,它每次都会影响不同大小的图像。这帮助我意识到它肯定与负载或资源/争用有关。

然后我查看了我的图像大小调整例程的代码),我对此感到相当自豪,因为它经过多次解析并在需要时智能地裁剪图像,同时还保持正确的比例等)。

我跑题了,但是每次我对图像进行另一次裁剪或调整大小操作时,我都会重新保存它,并再次从 Azure Blob 存储服务重新获取它。因此,对于一个典型的给定图像,我在重新处理例程期间将图像保存并提取到 Azure Blob 磁盘最多 3 次。我意识到这肯定对 IO 造成了太大的影响,所以我重构了一些东西,并在内存中完成了这一切,并且只有在图像处于非常最终状态时,才在最后一次保存回 Azure Blob 服务。

哇啦没有更多的随机黑线问题!全部解决。

非常感谢 Jcl 的想法。我应该将此标记为您的答案。

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 2013-12-24
    • 1970-01-01
    • 2014-06-03
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多