在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;
      }
 }

通过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)
    {
        //错误信息提示
    }

}

AE 将地图导出为图片的两种方法相关推荐

  1. ArcGIS Engine开发系列:将地图导出为图片的两种方法

    转自:http://blog.sina.com.cn/s/blog_4c5f70df0100a0ti.html 在ArcGIS的开发中,我们经常需要将当前地图打印(或是转出)到图片文件中.将Map或L ...

  2. Matlab导出eps图片的两种方法

    0.引言 在论文撰写的过程中,期刊往往对图片的格式有所要求,分辨率为600dpi的eps图片一种常见的要求.科研人员常用的Matab提供了多种导出eps的方法,本人目前使用了两种方法导出eps,在使用 ...

  3. python 学习系列(3) 读取并显示图片的两种方法

    python 读取并显示图片的两种方法 在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 mat ...

  4. 浏览器访问云服务器上图片的两种方法

    浏览器访问云服务器上图片的两种方法 1. Tomcat方式 打开tomcat的conf目录下配置文件server.xml 添加以下内容: <Context docBase="/home ...

  5. word涂改涂掉图片_怎么在word中修改图片的两种方法

    有时我们插入的图片只有一部分是我们想要的,那就需要我们将这一部分裁剪出来,word本身就可以方便快捷的对图片进行裁剪,那么下面就由学习啦小编给大家分享下在word中修改图片的技巧,希望能帮助到您. 在 ...

  6. jpg格式电脑怎么弄_电脑上怎么压缩JPG图片?两种方法帮你轻松解决

    我们在工作中经常会使用到各种图片,尤其做PPT时,需要大量的图片素材.为了方便保存与传输图片,首先我们要进行图片压缩,但在压缩时很容易导致图片质量受损.今天小编向大家分享两种图片压缩的方法,帮助大家在 ...

  7. jquery生成二维码怎么添加图片(两种方法)

    github项目地址: https://github.com/fengliting/erweima 注意:这里实现的是第一个方法 自动生成二维码里面添加图片,有两种方法,一种是使用jquery原生的二 ...

  8. 小程序设置背景图片的两种方法总结

    背景图片 我们会时常遇到设置背景图片,这里简单地总结下两种方法: 1.background-image background-image,顾名思义是背景图片的意思,设置父亲元素,然后通过backgro ...

  9. 怎么给README.md添加图片(两种方法,图文教程)?

    当你想要更好的介绍自己的项目的时候,发现别人的readme都是下面很多花里胡哨的图片介绍,而自己只能写字 其实添加图片有两种方式: 第一种: 在README.MD文件中写入 如果这样写的话png就得放 ...

最新文章

  1. 在实际案例(费用系统)中落地DDD
  2. Kotlin威胁、Python逆袭,2018年程序员需要升级哪些技能?(附报告下载)
  3. bzoj 3118: Orz the MST(单纯形)
  4. IT兄弟连 JavaWeb教程 Servlet转发
  5. 提高SQL查询效率(SQL优化)
  6. 【软件测试】黑盒测试の边界值分析法
  7. WordPress基础教学:绝对必装的JetPack外挂
  8. 小程序 图片上传php后台,微信小程序图片选择、上传到服务器、预览(PHP)实现实例...
  9. BZOJ 3053 The Closest M Points
  10. Linux 下杀毒软件 CPU 占用率为何持续升高
  11. antd的table遍历之后添加合计行_付费?是不可能的!20行Python代码实现一款永久免费PDF编辑工具...
  12. pytorch_GPU安装
  13. 阿里多语言翻译模型的前沿探索及技术实践
  14. list, tuple, dict, set的用法总结
  15. 用Winhex软件定位NTFS文件系统的不明白之处
  16. PIC单片机(PIC16F15323)的环境搭建
  17. java实现时间轮定时器_基于侵入式链表的时间轮定时器实现
  18. 解决remote: You are not allowed to upload code.fatal: unable to access.The requested URL error:403
  19. c++ primer plus编程练习题参考第六章
  20. 什么是京东自营商品?京东自营是什么意思?京东自营?

热门文章

  1. Android Studio实现音乐播放器2.0
  2. atm系统的用例模型_ATM银行系统用例图.doc
  3. linux复制 cp -rf 会覆盖已经存在的文件吗_Linux笔记之目录管理命令2
  4. 静态内部类实现单例_为什么用枚举类来实现单例模式越来越流行?
  5. 此流上不支持超时。_10分钟了解线程池,阿里再也不担心我线程池资源耗尽了...
  6. layer 退 回 点击变灰色
  7. switch -case 理解
  8. java this()函数_Java经典面试题之(如何正确的使用this?)
  9. 函数头模板_Python新手爬虫,爬取PPT模板
  10. 供销大集有潜力吗_社区团购遭点名批评,互联网巨头真的只是惦记那几捆白菜吗?| 吴坚浙商频道...