使用aspose.cad 将dwg文件转图片预览失败

net版本:4.6.1
aspose.cad 版本:22.1.0.0
demo代码:
using (CadImage cadImage = (CadImage)Image.Load(dwgFile))
{

                         List<string> layers = cadImage.Layers.GetLayersNames();

                        // 遍历所有布局
                        foreach (var item in cadImage.Layouts.Keys)
                        {
                            try
                            {
                                string layoutName = item.ToString();
                                Console.WriteLine($"Rendering layout: {layoutName} in file: {Path.GetFileName(dwgFile)}");


                            // 设置渲染选项
                            JpegOptions options = new JpegOptions
                                {
                                    VectorRasterizationOptions = new CadRasterizationOptions
                                    {
                                        PageWidth = cadImage.Width,  // 输出图片宽度
                                        PageHeight = cadImage.Height, // 输出图片高度
                                        BackgroundColor = Color.White, // 背景颜色
                                        DrawType = CadDrawTypeMode.UseObjectColor, // 使用对象颜色
                                        Layouts = new[] { layoutName }, // 渲染当前布局
                                        AutomaticLayoutsScaling = true, // 启用自动缩放
                                        NoScaling = false, // 启用缩放
                                        UnitType = UnitType.Millimeter // 单位类型
                                        //Layers = layers.ToArray() // 加载所有图层
                                    }
                                };

                                // 生成输出文件名
                                string outputFileName = $"{Path.GetFileNameWithoutExtension(dwgFile)}_{layoutName}.jpg";
                                string outputPath = Path.Combine(outputFolder, outputFileName);

                                // 保存为 JPEG 文件
                                cadImage.Save(outputPath, options);

                                Console.WriteLine("Saved: " + outputPath);
                            }
                            catch (CadException ex)
                            {
                                Console.WriteLine($"不支持的实体类型: {ex.Message}");
                                // 记录日志或忽略特定实体
                            }
                        }
                    }

通过代码转换后,有失败率,大约30%,生成的jpg图片有的是空白的 有的一条横线,其余成功,还有的原图像素很大的情况下 例如width和height10w以上,直接报错失败,请帮我分析原因,或者有没有完整的代码示例(兼容各种情况(处理了多布局、视图等等))预先格式化的文本

@ZhensongDong,
你好,
不同的失败可能有不同的原因。例如,我们建议控制 PageWidth 和 PageHeight 并设置一些合理的值,尤其是在导出到光栅时,因为 cadImage.Height/Width 可能很大,甚至在绘图中为零或无限大。
22.1 版本也非常旧,我们知道在那里转换为光栅时会出现一些问题,如果您更新到较新的版本(>24.1),这可能会很有用。
如果您附加一些测试文件,这可能会对我们有所帮助,这样我们就可以重现失败并直接查看原因。

Cad.zip (4.6 MB)

比如附件里的这3个文件 2个转化后没有内容,还有一个应该是因为尺寸问题 直接报错失败
用最新稳定的aspose.cad 版本25.3也是一样的问题

@ZhensongDong,
情况如下。2.dwg 和 3.dwg 图纸的高度和宽度较小,并且这些值出现在文件中,这不是文件读取问题。我们时不时会遇到这种情况,可能是由于某些软件没有正确更新文件中的 EXTMIN/EXTMAX 值而导致的。我们无法事先知道这些值是否正确。这种情况的唯一解决方案是调用 cadImage.UpdateSize() 强制更新图纸尺寸。使用它之后,我们可以看到 Model 和 Layout2 已正确导出,但 Layout1 未导出。我们创建了 CADNET-10093 以深入调查原因。

“转换失败.dwg”的尺寸非常大(417k*130k),所以导出它的唯一方法是设置输出光栅图像的尺寸,不是从绘图尺寸,而是例如 1000x1000 像素:PageWidth=1000,PageHeight=1000。

可是如果对于非常大的图片 我设置固定的分辨率(即长和宽),那原图中的细节不久没法看到了吗

我是希望尽量保持原图的尺寸 预览的时候做放大缩小 这个想法是不是不太合适

或者说我能转换的最大长和宽是多少呢 还有一个问题我怎么判断空白的layout不做转换呢

@ZhensongDong,
它们可能无法读取,但是对于如此巨大的绘图,导出为光栅时没有好的解决方案。光栅化和 JPG 压缩一样,都会扭曲小细节。甚至 - 即使成功导出到这种尺寸的光栅也不能保证细节没问题,因为这取决于绘图。你的想法很好 - 尽可能保持最大尺寸 - 但问题在于确定这个尺寸。你只能在你这边尝试并获得合适的值(或选择大小的策略),因为你需要资源(主要是内存,但也需要时间)来导出大光栅图像。例如,我可以获得 20k x 20k 的光栅图像,但对于一些随机绘图则不能获得 25k x 25k 的光栅图像。

如果你想要检测布局或模型是否为空,你可以使用这个例子:


List<string> notEmptyLayouts = new List<string>();

foreach (CadLayout layout in cadImage.Layouts.Values)
{
	foreach (CadBlockTableObject tableObject in cadImage.BlocksTables)
	{
		if (string.Equals(tableObject.HardPointerToLayout, layout.ObjectHandle))
		{
			if (cadImage.BlockEntities.ContainsKey(tableObject.BlockName))
			{
				CadBlockEntity cadBlockEntity = cadImage.BlockEntities[tableObject.BlockName];
				if (cadBlockEntity.Entities.Count > 0)
					notEmptyLayouts.Add(layout.LayoutName);
			}
			break;
		}
	}
}