在ArcGIS的开发中,我们经常需要将当前地图打印(或是转出)到图片文件中。将Map或Layout中的图象转出有两种方法,一种为通过
IActiveView的OutPut函数,另外一种是通过IExport接口来实现。第一种方法导出速度较快,实现也比较方便,但该方法对于图片的行或
列数超过10000左右时,导出经常会失败(具体原因未知),第二种方法导出速度较慢,但效果较好,且可以在导出过程中通过ITrackCancel来中
止导出操作。
通过IActiveView的方式导出是通过创建Graphics对象来实现,具体示例代码如下:
- /// <summary>
- /// 将Map上指定范围(该范围为规则区域)内的内容输出到Image,注意,当图片的行数或列数超过10000左右时,出现原因示知的失败
- /// </summary>
- /// <param name="pMap">需转出的MAP</param>
- /// <param name="outRect">输出的图片大小</param>
- /// <param name="pEnvelope">指定的输出范围(为Envelope类型)</param>
- /// <returns>输出的Image 具体需要保存为什么格式,可通过Image对象来实现</returns>
- public static Image SaveCurrentToImage(IMap pMap, Size outRect, IEnvelope pEnvelope)
- {
- //赋值
- tagRECT rect = new tagRECT();
- rect.left = rect.top = 0 ;
- rect.right = outRect.Width;
- rect.bottom = outRect.Height;
- try
- {
- //转换成activeView,若为ILayout,则将Layout转换为IActiveView
- IActiveView pActiveView = (IActiveView)pMap;
- // 创建图像,为24位色
- Image image = new Bitmap(outRect.Width, outRect.Height); //, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
- System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
- // 填充背景色(白色)
- g.FillRectangle(Brushes.White, 0 , 0 , outRect.Width, outRect.Height);
- int dpi = ( int )(outRect.Width / pEnvelope.Width);
- pActiveView.Output(g.GetHdc().ToInt32(), dpi, ref rect, pEnvelope, null );
- g.ReleaseHdc();
- return image;
- }
- catch (Exception excp)
- {
- MessageBox.Show(excp.Message + "将当前地图转出出错,原因未知" , "出错提示" , MessageBoxButtons.OK, MessageBoxIcon.Error);
- return null ;
- }
- }
/// <summary> /// 将Map上指定范围(该范围为规则区域)内的内容输出到Image,注意,当图片的行数或列数超过10000左右时,出现原因示知的失败 /// </summary> /// <param name="pMap">需转出的MAP</param> /// <param name="outRect">输出的图片大小</param> /// <param name="pEnvelope">指定的输出范围(为Envelope类型)</param> /// <returns>输出的Image 具体需要保存为什么格式,可通过Image对象来实现</returns> public static Image SaveCurrentToImage(IMap pMap, Size outRect, IEnvelope pEnvelope) { //赋值 tagRECT rect = new tagRECT(); rect.left = rect.top = 0; rect.right = outRect.Width; rect.bottom = outRect.Height; try { //转换成activeView,若为ILayout,则将Layout转换为IActiveView IActiveView pActiveView = (IActiveView)pMap; // 创建图像,为24位色 Image image = new Bitmap(outRect.Width, outRect.Height); //, System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image); // 填充背景色(白色) g.FillRectangle(Brushes.White, 0, 0, outRect.Width, outRect.Height); int dpi = (int)(outRect.Width / pEnvelope.Width); pActiveView.Output(g.GetHdc().ToInt32(), dpi, ref rect, pEnvelope, null); g.ReleaseHdc(); return image; } catch (Exception excp) { MessageBox.Show(excp.Message + "将当前地图转出出错,原因未知", "出错提示", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } }
通过IExport接口实现的导出,也需要通过IActiveView的OutPut来实现,但其转出句柄为IExport的StartExporting函数返回的DC,具体示例代码如下:
- //输出当前地图至指定的文件
- public void ExportMapExtent(IActiveView pView, Size outRect,string outPath)
- {
- try
- {
- //参数检查
- if pView == null )
- {
- throw new Exception( "输入参数错误,无法生成图片文件!" );
- }
- //根据给定的文件扩展名,来决定生成不同类型的对象
- ESRI.ArcGIS.Output.IExport export = null ;
- if (outPath.EndsWith( ".jpg" ))
- {
- export = new ESRI.ArcGIS.Output.ExportJPEGClass();
- }
- else if (outPath.EndsWith( ".tiff" ))
- {
- export = new ESRI.ArcGIS.Output.ExportTIFFClass();
- }
- else if (outPath.EndsWith( ".bmp" ))
- {
- export = new ESRI.ArcGIS.Output.ExportBMPClass();
- }
- else if (outPath.EndsWith( ".emf" ))
- {
- export = new ESRI.ArcGIS.Output.ExportEMFClass();
- }
- else if (outPath.EndsWith( ".png" ))
- {
- export = new ESRI.ArcGIS.Output.ExportPNGClass();
- }
- else if (outPath.EndsWith( ".gif" ))
- {
- export = new ESRI.ArcGIS.Output.ExportGIFClass();
- }
- export.ExportFileName = outPath;
- IEnvelope pEnvelope = pView.Extent;
- //导出参数
- export.Resolution = 300 ;
- tagRECT exportRect = new tagRECT();
- exportRect.left = exportRect.top = 0 ;
- exportRect.right = outRect.Width;
- exportRect.bottom = ( int )(exportRect.right * pEnvelope.Height / pEnvelope.Width);
- ESRI.ArcGIS.Geometry.IEnvelope envelope = new ESRI.ArcGIS.Geometry.EnvelopeClass();
- //输出范围
- envelope.PutCoords(exportRect.left, exportRect.top, exportRect.right, exportRect.bottom);
- export.PixelBounds = envelope;
- //可用于取消操作
- ITrackCancel pCancel = new CancelTrackerClass();
- export.TrackCancel = pCancel;
- pCancel.Reset();
- //点击ESC键时,中止转出
- pCancel.CancelOnKeyPress = true ;
- pCancel.CancelOnClick = false ;
- pCancel.ProcessMessages = true ;
- //获取handle
- System.Int32 hDC = export.StartExporting();
- //开始转出
- pView.Output(hDC, (System.Int16)export.Resolution, ref exportRect, pEnvelope, pCancel);
- bool bContinue = pCancel.Continue();
- //捕获是否继续
- if (bContinue)
- {
- export.FinishExporting();
- export.Cleanup();
- }
- else
- {
- export.Cleanup();
- }
- bContinue = pCancel.Continue();
- }
- catch (Exception excep)
- {
- //错误信息提示
- }
-
}