我目前有使用 GDI ( System.Drawing
) 的工作代码。但我正在考虑将其转换为使用System.Windows.Media.Imaging
或者ImageMagick
我担心这不应该泄漏内存,应该是线程安全的、多线程的并且应该提供高质量的结果。ImageMagick 似乎提供了所有这些。但是,System.Windows.Media.Imaging
已建议将其作为“更清洁”的解决方案。
你知道这两种方法有什么陷阱吗?
还有其他我应该考虑的选择吗?
我目前有使用 GDI ( System.Drawing
) 的工作代码。但我正在考虑将其转换为使用System.Windows.Media.Imaging
或者ImageMagick
我担心这不应该泄漏内存,应该是线程安全的、多线程的并且应该提供高质量的结果。ImageMagick 似乎提供了所有这些。但是,System.Windows.Media.Imaging
已建议将其作为“更清洁”的解决方案。
你知道这两种方法有什么陷阱吗?
还有其他我应该考虑的选择吗?
我有这个例程为我工作
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;
}
可能不会完全按照您的意愿行事,但您会大致了解。它在多线程环境中使用并且不会泄漏。