C#/GDI图形缩放(绘制线)

C#/GDI图形缩放(绘制线),c#,.net,gdi,C#,.net,Gdi,我正在写一些东西从矢量格式文件创建小位图预览。从文件中,我有一个(大的)线坐标列表。我想做的是缩放它,使其适合固定宽度的图像(96x96)。我之前一直在绘制位图的全尺寸,然后将其大小调整为96x96,但由于需要动态创建缩略图,结果证明速度不够快(这是一种非常愚蠢的方法!)。现在我只想缩放所有坐标,就像原始尺寸是96x96一样,放下所有相互重叠的点,这将大大提高性能 我对.NET图形/GDI的任何内容都是一个绝对的新手,第一个版本非常简单(代码如下)。我想知道图形库(或其他地方)中是否有什么东西可

我正在写一些东西从矢量格式文件创建小位图预览。从文件中,我有一个(大的)线坐标列表。我想做的是缩放它,使其适合固定宽度的图像(96x96)。我之前一直在绘制位图的全尺寸,然后将其大小调整为96x96,但由于需要动态创建缩略图,结果证明速度不够快(这是一种非常愚蠢的方法!)。现在我只想缩放所有坐标,就像原始尺寸是96x96一样,放下所有相互重叠的点,这将大大提高性能

我对.NET图形/GDI的任何内容都是一个绝对的新手,第一个版本非常简单(代码如下)。我想知道图形库(或其他地方)中是否有什么东西可以做到这一点,而无需我遍历所有点并对每个点进行计算

图形/GDI大师能给我指出正确的方向吗(或者让我知道没有方向)?我使用的是C#,而.NETFramework目标是可以的

到目前为止,它非常简单(tmpblocks是一组点):

位图绘图区;
图形xGraph;
DrawArea=新位图(64,64);
//^-以全尺寸绘制完整文件时,这是GetWidth()和GetHeight()
xGraph=Graphics.FromImage(绘图区域);
对于(int i=0;i1)
{
Pen tempPen=新笔(tmpblocks[i]。颜色,1.0f);
tempPen.StartCap=System.Drawing.Drawing2D.LineCap.Round;
tempPen.EndCap=System.Drawing.Drawing2D.LineCap.Round;
tempPen.LineJoin=System.Drawing.Drawing2D.LineJoin.Round;
xGraph.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality;
绘图线(tempPen,tmpblocks[i].针数);
}
}

对于缩略图,我将使用.GetThumbnail方法缩放生成的位图。非常慢,但是(显然)

您可以使用
Graphics.ScaleTransform(float-sx,float-sy)
来实现这一点

您可以从以下位置获取sx:TargetWidth/SourceWidth 和sy from:targetLight/SourceHeight


其中目标由目标图像大小定义,源是源图像大小。

您可以使用
Graphics.ScaleTransform(float sx,float sy)
完成此操作

您可以从以下位置获取sx:TargetWidth/SourceWidth 和sy from:targetLight/SourceHeight


其中目标由目标图像大小定义,源是源图像大小。

我看到并尝试过,但得到的只是一个白色BMP,角上有几行。我不确定为什么需要使用translate transform,除非矢量文件和图形设备之间存在其他坐标系差异,即y指向哪个方向。但是,如果这个答案有帮助,我会非常感激它被标记为已回答。我看到并尝试了它,但我得到的只是一个白色的BMP,在角落里有几行。我不确定为什么需要使用平移变换,除非向量文件和图形设备之间存在其他坐标系差异,即y指向哪个方向。然而,如果这个答案有帮助,我将非常感激它被标记为已回答。
Bitmap DrawArea;
Graphics xGraph;

DrawArea = new Bitmap(64, 64); 
// ^- this is GetWidth() and GetHeight() when drawing the full file at full size

xGraph = Graphics.FromImage(DrawArea);

for (int i = 0; i < tmpblocks.Count; i++)
{
 if (tmpblocks[i].stitches.Length > 1)
 {
 Pen tempPen = new Pen(tmpblocks[i].color, 1.0f);
 tempPen.StartCap = System.Drawing.Drawing2D.LineCap.Round;
 tempPen.EndCap = System.Drawing.Drawing2D.LineCap.Round;
 tempPen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;
 xGraph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 xGraph.DrawLines(tempPen, tmpblocks[i].stitches);
 }
}