我目前使用GDI(System.Drawing
)编写代码。但我正在考虑转换为使用System.Windows.Media.Imaging
或 ImageMagick
我担心的是,这不应该泄漏内存,应该是线程安全的,多线程的,并且应该提供高质量的结果。 ImageMagick似乎提供了所有这些。但是,System.Windows.Media.Imaging
被认为是一种“更清洁”的解决方案。
你知道这些方法有任何陷阱吗?
我还有其他选择吗?
答案 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;
}
可能不会完全按照你的意愿行事,但你会得到一般的想法。它用于多线程环境,不会泄漏。