这是我的问题How To Handle Image as Background to CAD Application加快图像处理
后续我应用的尺寸/重新采样代码,但它没有做任何区别。我相信我对GDI +等知识不够,所以请原谅我,如果我似乎混乱。
我正在使用第三方图形库(Piccolo)。我无法确定它究竟是在做什么,而不是直接包装GDI +。
我的测试是在不同的缩放级别旋转显示 - 这是导致性能最差的过程。我知道我正在旋转相机视图。在缩放级别达到1.0时,没有性能下降,使用鼠标滚轮可以平滑旋转。图像必须以1.0的缩放级别缩放到每像素1m的CAD单位。我已调整大小/重新采样图像以匹配。我曾尝试不同的方法基于最后一个问题给我的代码,以加快这:
public static Bitmap ResampleImage(Image img, Size size) {
using (logger.VerboseCall()) {
var bmp = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppPArgb);
using (var gr = Graphics.FromImage(bmp)) {
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Low;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
gr.DrawImage(img, new Rectangle(Point.Empty, size));
}
return bmp;
}
}
我想这加速了重采样,但据我可以告诉有尝试时对性能没有影响以高缩放级别旋转显示器。用户性能分析器(蚂蚁),我能够找到导致性能命中代码:
protected override void Paint(PPaintContext paintContext) {
using (PUtil.logger.DebugCall()) {
try {
if (Image != null) {
RectangleF b = Bounds;
Graphics g = paintContext.Graphics;
g.DrawImage(image, b);
}
}
catch (Exception ex) {
PUtil.logger.Error(string.Format("{0}\r\n{1}", ex.Message, ex.StackTrace));
//----catch GDI OOM exceptions
}
}
}
对性能的影响是完全g.DrawImage(图像,B);
边界是图像的边界当然。 catch块在那里可以捕获GDI + OOM异常,这在高缩放级别下看起来更糟糕。
的时候这就是所谓的数字似乎随着缩放级别增加....
有代码画相机另外一个打击,但我没有足够的信息来解释但不同之处在于这似乎画了连接到摄像机的所有图层 - 以及我假设的所有对象 - 当摄像机视图矩阵和剪辑应用于paintContext时(无论如何)。
所以有一些其他调用g.DrawImage(图像,B);我可以使用?还是我在图形引擎的摆布?不幸的是做嵌入式,这将是非常难以改变的,我
再次感谢
该代码使用两个不同的对象,一个名为Image,另一个名为image。准确性在这里很重要。如果此图形库应用了转换(Graphics.Transform不是单位矩阵),那么重新采样图像不会让您前进。 –
嗯 - 我没有注意到。我会再次检查这段代码。您对重新采样的评论当然是正确的。目前,我正在将图像重新采样到合适的尺寸,并将图像的颜色深度改为8位,以减小图像尺寸。我不确定这有什么影响。除非我可以找到某种方法来减少对g.DrawImage的调用,或者找到一种更快执行的方法(使用非托管代码?),我认为我不会去哪里。 – ScruffyDuck