autocad.net-图片打印合成
调用打印程序“PublishToWeb JPG.pc3”进行图片打印,该打印驱动程序中内置了很多的打印方案,在同尺寸的打印方案下,数据范围越大打印出来的清晰度就越差,内置的尺寸不一定都满足,在又要通过我们的插件去完成打印任务,又不能让客户总是做配置的情况下,我总结了一个不是很完美的解决方案,实现思路如下:
1、选定基础打印尺寸方案(本demo选定“UserDefinedRaster (1600.00 x 1200.00Pixels)”),一定是系统自带的,不然就需要人工配置,暂时没有找到通过代码去修改打印方案
2、在一定的精度比例尺下(本demo是一个像素点代表10个坐标点的跨度),根据用户选择的范围计算出要打印的图片数量。
3、将单张打印的图片存储到临时文件夹下,等全部打印完毕,按照顺序合并成一张图图片
主方法,打印合成的入口
1 public bool CutImgAndPutFromLeftUpperCAD(Document doc) 2 { 3 Point3d maxPt = Point3d.Origin; 4 Point3d minPt = Point3d.Origin; 5 PromptIntegerOptions prInt = new PromptIntegerOptions("\n请选择导出方式:选择方式(1:全图导出,2:拉框导出):"); 6 prInt.DefaultValue = 1; 7 prInt.AllowArbitraryInput = false; 8 prInt.AllowNegative = false; 9 prInt.AllowNone = false; 10 PromptIntegerResult ptrInt = Tools.MdiAcEditor.GetInteger(prInt); 11 if (ptrInt.Status != PromptStatus.OK) 12 return false; 13 switch (ptrInt.Value) 14 { 15 case 1: 16 maxPt = doc.Database.Extmax; 17 minPt = doc.Database.Extmin; 18 break; 19 case 2: 20 PromptPointOptions StartPoint = new PromptPointOptions("\n请选择第一个角点"); 21 PromptPointResult StartPointResult = Tools.MdiAcEditor.GetPoint(StartPoint); 22 PromptCornerOptions PromptCornerOptions = new PromptCornerOptions("\n请选中第二个角点", StartPointResult.Value); 23 PromptPointResult EndPointResult = Tools.MdiAcEditor.GetCorner(PromptCornerOptions); 24 double maxX = StartPointResult.Value.X > EndPointResult.Value.X ? StartPointResult.Value.X : EndPointResult.Value.X; 25 double minX = StartPointResult.Value.X > EndPointResult.Value.X ? EndPointResult.Value.X : StartPointResult.Value.X; 26 double maxY = StartPointResult.Value.Y > EndPointResult.Value.Y ? StartPointResult.Value.Y : EndPointResult.Value.Y; 27 double minY = StartPointResult.Value.Y > EndPointResult.Value.Y ? EndPointResult.Value.Y : StartPointResult.Value.Y; 28 29 maxPt = new Point3d(maxX, maxY, 0); 30 minPt = new Point3d(minX, minY, 0); 31 break; 32 } 33 34 string JPGSavePath = Const.systemPath + "\\Save"; 35 string dataSavePath = Const.systemPath + "\\Temp"; 36 if (Directory.Exists(dataSavePath)) 37 { 38 FileOperate.DelectDir(dataSavePath); 39 } 40 else 41 { 42 Directory.CreateDirectory(dataSavePath); 43 } 44 if (Directory.Exists(JPGSavePath)) 45 { 46 FileOperate.DelectDir(JPGSavePath); 47 } 48 else 49 { 50 Directory.CreateDirectory(JPGSavePath); 51 } 52 Point3d LeftUpP = new Point3d(minPt.X, maxPt.Y, 0); 53 Point3d RightDownP = new Point3d(maxPt.X, minPt.Y, 0); 54 Point3d LeftDownP = new Point3d(minPt.X, minPt.Y, 0); 55 Point3d RightUpP = new Point3d(maxPt.X, maxPt.Y, 0); 56 //根据坐标范围计算图片的数量,多于100张不执行打印任务 57 int rows = Convert.ToInt32(Math.Floor(LeftUpP.Y - RightDownP.Y) / 12000.0) + 1; 58 int cels = Convert.ToInt32(Math.Floor(RightUpP.X - LeftUpP.X) / 16000.0) + 1; 59 if (rows *cels > 100) 60 { 61 return false; 62 } 63 int cutTrueCount = 0; 64 int itemImgCount = 0; 65 itemImgCount = 0; 66 int imgCount = 0; 67 string imgPathAndName = string.Empty; 68 CircularProgress cirProgress = new CircularProgress(0, rows * cels, "正在导出图片"); 69 cirProgress.StartProgress(); 70 71 try 72 { 73 74 for (int row = 0; row < rows; row++) 75 { 76 for (int cel = 0; cel < cels; cel++) 77 { 78 try 79 { 80 imgCount++; 81 cirProgress.SendMessageChangeValue("正在切图 ", (imgCount*100)/ (rows * cels)); 82 double nowLeftX = LeftUpP.X + (double)(cel * 16000); 83 double nowLeftY = LeftUpP.Y - (double)(row * 12000); 84 Point3d leftPoint = new Point3d(nowLeftX, nowLeftY - 12000, 0); 85 Point3d rightPoint = new Point3d(nowLeftX + 16000, nowLeftY, 0); 86 string m_ImgName = string.Concat(new object[] 87 { 88 row, 89 "_", 90 cel, 91 ".jpg" 92 }); 93 imgPathAndName = dataSavePath + "\\"; 94 object obj = imgPathAndName; 95 imgPathAndName = string.Concat(new object[] 96 { 97 obj, 98 row, 99 "_", 100 cel, 101 ".jpg" 102 }); 103 //单张图片打印 104 ExportMapToFileCAD(leftPoint, rightPoint, imgPathAndName, doc); 105 itemImgCount++; 106 cutTrueCount++; 107 } 108 catch 109 { 110 break; 111 } 112 } 113 } 114 string JPGName = doc.Window.Text; 115 JPGName = JPGName.Split(new char[] { '.' })[0]; 116 //开始合成图片 117 CombinImage(rows, cels, 1600, 1200, dataSavePath, JPGSavePath + "\\" + JPGName + ".jpg", cirProgress); 118 Tools.MdiAcEditor.WriteMessageWithReturn("图片导出成功:" + JPGSavePath + "\\" + JPGName + ".jpg"); 119 cirProgress.StopProgress(); 120 return true; 121 122 } 123 catch (Exception ex) 124 { 125 cirProgress.StopProgress(); 126 return false; 127 } 128 }
1 private bool ExportMapToFileCAD(Point3d leftPoint, Point3d rigthPoint, string fileName, Document doc) 2 { 3 bool result; 4 try 5 { 6 Editor ed = doc.Editor; 7 Database db = doc.Database; 8 if (fileName.Trim().Equals("")) 9 { 10 result = false; 11 } 12 else 13 { 14 using (doc.LockDocument()) 15 { 16 using (Transaction tr = db.TransactionManager.StartTransaction()) 17 { 18 //一定要记得设置,否则打印将非常之慢 19 Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("BackGroundPlot", 0); 20 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); 21 Layout lo = (Layout)tr.GetObject(btr.LayoutId, OpenMode.ForWrite); 22 PlotInfo pi = new PlotInfo(); 23 pi.Layout = btr.LayoutId; 24 PlotSettings ps = new PlotSettings(lo.ModelType); 25 ps.CopyFrom(lo); 26 PlotSettingsValidator psv = PlotSettingsValidator.Current; 27 //很重要,坐标处理,针对自定义坐标系的,像天正的图纸,不做处理可能会打印出空白的 28 Extents2d ext2d = Ucs2Dcs(leftPoint, rigthPoint); 29 psv.SetPlotWindowArea(ps, ext2d); 30 psv.SetPlotType(ps, Autodesk.AutoCAD.DatabaseServices.PlotType.Window); 31 psv.SetPlotRotation(ps, 0); 32 psv.SetStdScaleType(ps, 0); 33 psv.SetPlotCentered(ps, true); 34 35 psv.GetCanonicalMediaNameList(ps); 36 psv.SetPlotConfigurationName(ps, "PublishToWeb JPG.pc3", "UserDefinedRaster (1600.00 x 1200.00Pixels)"); 37 pi.OverrideSettings = ps; 38 PlotInfoValidator piv = new PlotInfoValidator(); 39 piv.MediaMatchingPolicy = MatchingPolicy.MatchEnabled; 40 piv.Validate(pi); 41 while ((PlotFactory.ProcessPlotState == ProcessPlotState.BackgroundPlotting) || (PlotFactory.ProcessPlotState == ProcessPlotState.ForegroundPlotting)) 42 { 43 System.Threading.Thread.Sleep(1); 44 } 45 if (PlotFactory.ProcessPlotState == 0) 46 { 47 PlotEngine pe = PlotFactory.CreatePublishEngine(); 48 using (pe) 49 { 50 PlotProgressDialog ppd = new PlotProgressDialog(false, 1, true); 51 using (ppd) 52 { 53 ppd.set_PlotMsgString(0, "CAD切图"); 54 ppd.set_PlotMsgString(PlotMessageIndex.CancelJobButtonMessage, "取消切图"); 55 ppd.set_PlotMsgString(PlotMessageIndex.CancelSheetButtonMessage, "取消切图"); 56 ppd.set_PlotMsgString(PlotMessageIndex.SheetSetProgressCaption, "切图"); 57 ppd.set_PlotMsgString(PlotMessageIndex.SheetProgressCaption, "正在切图"); 58 ppd.LowerPlotProgressRange = 0; 59 ppd.UpperPlotProgressRange = 100; 60 ppd.PlotProgressPos = 0; 61 ppd.OnBeginPlot(); 62 ppd.IsVisible = false; 63 pe.BeginPlot(ppd, null); 64 pe.BeginDocument(pi, fileName, null, 1, true, fileName); 65 ppd.OnBeginSheet(); 66 ppd.LowerSheetProgressRange = 0; 67 ppd.UpperSheetProgressRange = 100; 68 ppd.SheetProgressPos = 0; 69 PlotPageInfo ppi = new PlotPageInfo(); 70 pe.BeginPage(ppi, pi, true, null); 71 pe.BeginGenerateGraphics(null); 72 pe.EndGenerateGraphics(null); 73 pe.EndPage(null); 74 ppd.SheetProgressPos = 100; 75 ppd.OnEndSheet(); 76 pe.EndDocument(null); 77 ppd.PlotProgressPos = 100; 78 ppd.OnEndPlot(); 79 pe.EndPlot(null); 80 } 81 } 82 } 83 else 84 { 85 ed.WriteMessage("\n另外一个程序正在运行中。。。"); 86 } 87 } 88 } 89 result = true; 90 } 91 } 92 catch (System.Exception ex) 93 { 94 result = false; 95 } 96 return result; 97 }
根据范围打印单张图片
1 private void CombinImage(int rows, int cels, int width, int height,string url,string outPath , CircularProgress cirProgress) 2 { 3 using (Bitmap bg = new Bitmap(cels * width, rows * height)) 4 { 5 //构建画布 6 Graphics g = Graphics.FromImage(bg); 7 //清除画布,背景透明 8 g.Clear(Color.Transparent); 9 int leftUpX = 0; 10 int leftUpY = 0; 11 int count = 0; 12 cirProgress.SendMasterChangeMessage("正在进行图片合成", rows * cels); 13 for (int row = 0; row < rows; row++) 14 { 15 for (int cel = 0; cel < cels; cel++) 16 { 17 count++; 18 cirProgress.SendMessageChangeValue("正在进行图片合成",(count*100)/(rows*cels)); 19 //加载小图片 20 System.Drawing.Image img = System.Drawing.Image.FromFile(url + "\\" + row + "_" + cel + ".jpg"); 21 //确定插入位置 22 leftUpX = (cel * width); 23 leftUpY = (row * height); 24 //插入图片到画布中 25 g.DrawImage(img, new System.Drawing.Point(leftUpX, leftUpY)); 26 img.Dispose(); 27 } 28 } 29 g.Dispose(); 30 bg.Save(outPath); 31 cirProgress.SendMessageChangeValue("正在进行图片反色", (count * 100) / (rows * cels)); 32 // 反色处理并且保存图片 33 reversePic(bg); 34 //Bitmap tempBitmap = reversePic(bg); 35 //tempBitmap.Save(Const.systemPath + "\\Save\\test.jpg"); 36 //tempBitmap.Dispose(); 37 } 38 }
图片合成
1 Extents2d Ucs2Dcs(Point3d objStart, Point3d objEnd) 2 { 3 ResultBuffer rbFrom = 4 new ResultBuffer(new TypedValue(5003, 1)), 5 rbTo = 6 new ResultBuffer(new TypedValue(5003, 2)); 7 8 9 double[] firres = new double[] { 0, 0, 0 }; 10 double[] secres = new double[] { 0, 0, 0 }; 11 12 CommandTools.acedTrans( 13 objStart.ToArray(), 14 rbFrom.UnmanagedObject, 15 rbTo.UnmanagedObject, 16 0, 17 firres 18 ); 19 20 21 CommandTools.acedTrans( 22 objEnd.ToArray(), 23 rbFrom.UnmanagedObject, 24 rbTo.UnmanagedObject, 25 0, 26 secres 27 ); 28 29 30 Extents2d window = 31 new Extents2d( 32 firres[0], 33 firres[1], 34 secres[0], 35 secres[1] 36 ); 37 return window; 38 }
坐标转换
转载于:https://www.cnblogs.com/he-xiang/p/7890751.html
autocad.net-图片打印合成相关推荐
- 没有桌面体验功能就不能进行图片打印
在server 2008 R2服务器上放了几张图片,想依次预览一下,没想到双击打开后竟然是用的画图程序,遂去更改默认打开程序,没想到不支持,提示"没有桌面体验功能就不能进行图片打印" ...
- 使用opencv创建一张纯黑色的图片与其他图片进行合成
功能:使用opencv创建一张纯色的的照片,颜色以及大小尺寸自己设置. 说明:这里的cvSize控制创建图片的大小,就是长和宽.那么在使用for循环的时候注意i j的范围.使用这种方法你可以创建任意 ...
- Vue.js结合Canvas制作二维码和图片的合成(qrcanvas + html2canvas)
(这个有问题,最近会把整理后的更新上去!!!!!!) 最新最新!!!:https://blog.csdn.net/zuorishu/article/details/88632978 需求背景: 分享图 ...
- 使用ffmpeg用图片批量合成抖音卡点短视频
技术交流 使用ffmpeg用图片批量合成抖音卡点短视频 ffmpeg工具准备 图片和音乐文件准备 ffmpeg命令行合成图片 短视频合成的效果 使用ffmpeg用图片批量合成抖音卡点短视频 近期在研究 ...
- Java 将图片组合成PDF文件
程序界面图: 代码清单: package 将图片组合成PDF文件; import java.awt.event.ActionEvent; import java.awt.event.ActionLis ...
- 指纹图片调对比度 c语言,手动调整图片打印深浅(亮度/对比度 Windows OS)
文档标题:手动调整图片打印深浅(亮度/对比度 Windows OS) 文档代码:CHN-FP0548-1 最近修改日期:2020年11月19日 手动调整图片打印深浅(亮度/对比度 Windows OS ...
- canvas图片文字合成(小程序分享)
写这个的原因是在写一个小程序的需求的时候用到了,在此记录一下. 需求需要实现的点就是:在分享小程序个人资料页面的时候将个人信息和个人头像进行重叠放在一起然后分享出去,大概样子如下: 不同的用户头像不同 ...
- 图片怎么合成gif动图?操作步骤详解
图片怎么合成gif动图?gif动图的使用非常的广泛,平时我们聊天中见到的动态表情,已经逛某宝时看到的动态广告图,其实都是gif动图.小编作为一名互联网从业者,经常需要使用或者制作gif动态图片.不知道 ...
- 打印机有些图片打印不出来
设备为android7.1.2的移动终端,内嵌打印机 问题描述:部分图片打印不出来 解决:android中不同分辨率的图片会存放不同目录中,我这一般只做一张二倍图,所以图片都值存放于一个目录底下,an ...
- 强大的多功能图片处理器微信小程序源码下载图片画框合成
大家好这是以开以图片为主题的一款小程序 里面拥有了多种的图片处理功能,也算是比较强大的一款 另外小编最喜欢的就是里面的图片画框合成这个功能 该功能里面有N种画框模板,然后画框的尺寸根据您的图片自适应处 ...
最新文章
- uva 11995 I Can Guess the Data Structure!
- 如何将MATLAB程序发布为独立的不依赖MATLAB环境可执行的程序包(基于Matlab R2015b版 )
- 产品经理学习总结(1)——人人都是产品经理之需求文档语法
- 可靠信道传输2.0 2.1 3.0
- CentOS[linux]操作系统的安装手册
- 计算机视觉基础:霍夫变换(Computer Vision Fundamentals: Hough Transform)
- matlab光滑曲线链接,在Matlab中使用光滑曲线连接点
- 图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题 - 人工智能 - 电子发烧友网...
- 误差柱状图的三种实现方法
- 对网上一些Java笔试题的总结,答案与自我理解(400道)
- GAN相关论文《Spectral Regularization for Combating Mode Collapse in GANs》
- NOI2021 D类打铁记
- 2011大纽约区域赛试题 Decoding EDSAC Data 解题报告
- java计算抛物线的标准方程_抛物线及其标准方程
- linux下安装以太坊(ETH/ETC)节点
- windows日志查看与清理
- PXE高效网络装机与Kickstart无人值守
- php实现新浪微博分享功能,自定义新浪微博分享按钮样式
- 人工智能基础——搜索算法
- 第二十四章 面向对象------属性
热门文章
- 【教程】python递归三部曲(基于turtle实现可视化)-一、谢尔宾斯基三角形
- 【matlab】数值计算实现电路仿真
- 训练集和测试集 (Training and Test Sets):拆分数据
- Tbase 源码 (三)
- vscode 折叠/展开所有区域代码快捷键
- 会考计算机基础操作知识点总结,计算机应用基础会考复习主要知识点
- Android移动开发基础案例教程第2版课后习题
- 电子技术基础(三)__第3章 集成运算放大器及其应用
- GoodERP交付手册:CRM模块交付
- EasyCamera Android安卓移动视频监控单兵设备接入EasyDarwin开源流媒体云平台