You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用netDxf库将200x200 DXF缩放后适配800x800面板绘制

解决netDxf绘制DXF到Panel无失真缩放的问题

直接修改Bitmap尺寸会导致像素拉伸失真,正确的做法是在矢量绘制阶段应用缩放变换,而非事后调整位图大小。以下是基于netDxf库的具体实现步骤:

核心思路

  1. 计算等比缩放比例:根据Panel的800x800尺寸和DXF原始200x200尺寸,得出缩放比例为4(若需适配非等比场景,可取宽高比例的最小值)。
  2. 应用Graphics变换:在绘制DXF实体前,给Graphics对象设置缩放和平移变换,确保DXF居中且等比放大到Panel尺寸。
  3. 高质量绘制配置:开启抗锯齿等高质量渲染选项,进一步保证无失真效果。

代码实现(C# WinForms)

using netDxf;
using netDxf.Entities;
using netDxf.Graphics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

public void RenderDxfToPanel(Panel targetPanel, string dxfFilePath, string layerName)
{
    // 加载目标DXF文件
    DxfDocument dxfDoc = DxfDocument.Load(dxfFilePath);
    
    // 获取指定图层的所有实体
    Layer targetLayer = dxfDoc.Layers[layerName];
    if (targetLayer == null || targetLayer.Entities.Count == 0)
        return;

    // 创建与Panel同尺寸的Bitmap作为绘制画布
    using (Bitmap canvas = new Bitmap(targetPanel.Width, targetPanel.Height))
    using (Graphics g = Graphics.FromImage(canvas))
    {
        // 配置高质量渲染参数
        g.SmoothingMode = SmoothingMode.AntiAlias;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
        g.Clear(targetPanel.BackColor);

        // 计算缩放比例(等比适配Panel)
        float dxfOriginalSize = 200f;
        float scale = Math.Min(targetPanel.Width / dxfOriginalSize, targetPanel.Height / dxfOriginalSize);

        // 计算偏移量,使DXF在Panel中居中显示
        float offsetX = (targetPanel.Width - dxfOriginalSize * scale) / 2;
        float offsetY = (targetPanel.Height - dxfOriginalSize * scale) / 2;

        // 应用变换:先平移到居中位置,再执行缩放
        g.TranslateTransform(offsetX, offsetY);
        g.ScaleTransform(scale, scale);

        // 绘制指定图层的所有实体
        EntityRenderer renderer = new EntityRenderer(g);
        foreach (Entity entity in targetLayer.Entities)
        {
            renderer.Draw(entity, dxfDoc.Header.Version);
        }

        // 将绘制结果设置为Panel背景(避免Bitmap被释放)
        targetPanel.BackgroundImage = (Bitmap)canvas.Clone();
    }
}

关键说明

  • 避免直接修改已生成小尺寸Bitmap的大小:这种操作是对像素的拉伸,必然导致失真。
  • 矢量级缩放:通过Graphics的ScaleTransform实现对DXF实体的矢量缩放,保证图形边缘清晰。
  • 居中处理:通过TranslateTransform调整绘制原点,让放大后的DXF始终位于Panel中心。

内容的提问来源于stack exchange,提问作者Martins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:01:27