推荐的快速,安全的服务器端图像大小调整方法

时间:2013-03-14 13:29:19

标签: c# .net asp.net-mvc azure imagemagick

我目前使用GDI(System.Drawing)编写代码。但我正在考虑转换为使用System.Windows.Media.Imaging ImageMagick

我担心的是,这不应该泄漏内存,应该是线程安全的,多线程的,并且应该提供高质量的结果。 ImageMagick似乎提供了所有这些。但是,System.Windows.Media.Imaging被认为是一种“更清洁”的解决方案。

你知道这些方法有任何陷阱吗?

我还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

我有这个例程为我工作

public Bitmap FitImage(Image imgPhoto, int Width, int Height)
{
  int sourceWidth = imgPhoto.Width;
  int sourceHeight = imgPhoto.Height;
  int sourceX = 0;
  int sourceY = 0;
  int destX = 0;
  int destY = 0;

  float nPercent = 0;
  float nPercentW = 0;
  float nPercentH = 0;

  nPercentW = ((float)Width / (float)sourceWidth);
  nPercentH = ((float)Height / (float)sourceHeight);

  if (nPercentH < nPercentW) {
    nPercent = nPercentW;
    destY = (int)((Height - (sourceHeight * nPercent)) / 2);
  } else {
    nPercent = nPercentH;
    destX = (int)((Width - (sourceWidth * nPercent)) / 2);
  }

  int destWidth = (int)Math.Round(sourceWidth * nPercent);
  int destHeight = (int)Math.Round(sourceHeight * nPercent);

  Bitmap newPhoto = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
  Graphics newgrPhoto = Graphics.FromImage(newPhoto);
  newgrPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic; 
  newPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);

  newgrPhoto.PixelOffsetMode = PixelOffsetMode.Half;

  var attr = new ImageAttributes();
  attr.SetWrapMode(WrapMode.TileFlipXY);

  newgrPhoto.DrawImage(imgPhoto,
      new Rectangle(destX, destY, destWidth, destHeight),
      sourceX, sourceY, sourceWidth, sourceHeight,
      GraphicsUnit.Pixel,
      attr
   );

  newgrPhoto.Dispose();

  return newPhoto;
}

可能不会完全按照你的意愿行事,但你会得到一般的想法。它用于多线程环境,不会泄漏。