C# .NET:GDI+;缩放-缓存缩放位图?

C# .NET:GDI+;缩放-缓存缩放位图?,c#,.net,gdi+,C#,.net,Gdi+,我正在开发一个应用程序,它显示背景图像,背景上散布着许多字形/图形对象。实现了平移和缩放 显示图形的内部表示具有精确的坐标和毫米大小-图形需要反映真实世界的图形。 到目前为止,我正在使用GDI+转换矩阵在我的坐标系中运行,并让框架进行计算和绘图。确实很方便 private Matrix SetupGraphicTransformation() { Matrix mx = new Matrix(); mx.Scale(_zoom, _zoom); mx.Translate(

我正在开发一个应用程序,它显示背景图像,背景上散布着许多字形/图形对象。实现了平移和缩放

显示图形的内部表示具有精确的坐标和毫米大小-图形需要反映真实世界的图形。 到目前为止,我正在使用GDI+转换矩阵在我的坐标系中运行,并让框架进行计算和绘图。确实很方便

private Matrix SetupGraphicTransformation()
{
    Matrix mx = new Matrix();
    mx.Scale(_zoom, _zoom);
    mx.Translate(this.AutoScrollPosition.X / Project.RasterizedImage.HorizontalResolution, this.AutoScrollPosition.Y / Project.RasterizedImage.VerticalResolution, MatrixOrder.Append);
    return mx;
}
但是,我面临一个性能问题,这是由OnPaint事件引起的,它需要输出背景和对象。背景是最大的问题。是这样画的:

// ...
// in OnPaint
e.Graphics.Transform = SetupGraphicTransformation();
e.Graphics.PageUnit = GraphicsUnit.Millimeter;
e.Graphics.InterpolationMode = _interpolationMode;

this.DrawMainImage(e.Graphics);
this.DrawTagObjects(e.Graphics);
// ...


private void DrawMainImage(Graphics graphics)
{
    graphics.DrawImage(Project.RasterizedImage.Image,
        0, 0, Project.RasterizedImage.ActualSize.Width, Project.RasterizedImage.ActualSize.Height);
    // ActualSize is in mm
}
我的第一个想法是摆脱转换中的缩放,当用户缩放到某个缩放级别并输出预缩放位图时,只需调整位图的大小。但是,我当然会失去其他对象坐标的缩放,需要执行所有计算

据我所知,是GDI+在查看位图的原始大小和视口大小并执行所有计算后决定缩放位图。它总是缩放,因为我总是从原始图像开始。
如果不需要缩放,您将如何避免缩放?

当然,重新缩放大型位图非常昂贵,并且在绘制时会明显降低UI的速度。燃烧几百毫秒并不少见,你可以看到。所以不要那样做。只要在需要时重新缩放一次。使用32bppPArgb像素格式,它比其他格式快10倍。嗯,是的,这是一般的想法。但是(可能我解释得不够清楚),我想调整位图的大小,将其存储在变量中,然后输出调整大小的版本,即1:1,不进行转换。然后,图形的其余部分应该像以前一样进行转换。嗯,也许我会尝试一下——首先输出背景,然后应用新的矩阵,然后完成其余的绘图?不知怎的,直到现在我才想到这一点。