0

我目前有使用 GDI ( System.Drawing) 的工作代码。但我正在考虑将其转换为使用System.Windows.Media.Imaging或者ImageMagick

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

你知道这两种方法有什么陷阱吗?

还有其他我应该考虑的选择吗?

4

1 回答 1

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;
}

可能不会完全按照您的意愿行事,但您会大致了解。它在多线程环境中使用并且不会泄漏。

于 2013-03-14T13:40:36.933 回答