delphi/C#实现,其他语言稍微改下就行了。AE的编码各个语言都差不多,这里也没用到某一语言的特性。
函数特点:
1.可以精确导出指定范围的图形要素
2.支持多格式.TIF, .EMF,.GIF,.PDF,.PNG,.SVG,.AI,.EPS,.jpg等
3.Tif格式导出时支持坐标信息导出,支持压缩格式选择
 
 
delphi 版:
{海龙 created
功能说明:指定地图窗口指定区域裁图
参数说明:
指定地图窗口pMap
指定范围裁图pExtent,如某一图形的envolope或map.extent之类的
输出图片文件名称strPicFile,根据后缀名判断裁出图片类型
输出图片dpi iOutResolution ,默认300
裁图时地图窗口需设置的比例尺 sMapBLC ,可以为空
bGeoTiff 文件类型为tif时有效,为true时保存坐标信息
pTifCompressionType 文件类型为tif时有效,tif的压缩类型,默认无损
} function ClipMap2Pic(pMap: IMap;pExtent: IEnvelope; strPicFile: String; iOutResolution: Integer = ; sMapBLC: String = '';
bGeoTiff : Boolean = False; pTifCompressionType: esriTIFFCompression = esriTIFFCompressionNone):Boolean;
var
pAV: IActiveView;
pEnvNew: IEnvelope;
ptagTmp: tagRECT;
pExport: IExport;
ihdc, iPrevOutputImageQuality: Integer;
dRes: Double;
dWidth, dHeight, dMapBLC: Double;
tmpDC: HDC;
iScreenResolution: Integer;
deviceRECT: tagRECT;
pSD: IScreenDisplay;
pDT: IDisplayTransformation;
sWJLX: string;
//地图距离转屏幕像素数,不同缩放比例尺下同样距离对应像素数不同的,有特殊需要时设置sMapBLC
function ConvertMapUnitsToPixels(pAV: IActiveView;dMapUnits: Double):double;
var
pBounds: IEnvelope;
pDeviceFrame: tagRECT;
iDeviceRight, iDeviceLeft, iPixelExtent: integer;
dRealWorldExtent, dSizeOfEachPixel: double;
begin
Result:= ;
pDT.Get_DeviceFrame(pDeviceFrame);
iDeviceLeft:= pDeviceFrame.left;
iDeviceRight:= pDeviceFrame.right;
iPixelExtent:= iDeviceRight-iDeviceLeft;
pDT.Get_VisibleBounds(pBounds);
pBounds.Get_Width(dRealWorldExtent);
dSizeOfEachPixel:= dRealWorldExtent / iPixelExtent;
Result:= dMapUnits/dSizeOfEachPixel ;
end;
begin
Result:= False;
if pMap = nil then Exit;
if strPicFile = '' then Exit;
try
if FileExists(strPicFile) then
DeleteFile(PChar(strPicFile));
if (sMapBLC <> '') and TryStrToFloat(sMapBLC, dMapBLC) and (dMapBLC > ) then
pMap.Set_MapScale(StrToFloatEx(sMapBLC));//map的比例尺调整为出图比例尺
pAV:= pMap as IActiveView; sWJLX := UpperCase(RightStr(strPicFile, ));
if sWJLX = '.TIF' then //根据文件名后4位判断输出类型
pExport := CoExportTiff.Create as IExport
else
if sWJLX = '.EMF' then
pExport := CoExportEMF.Create as IExport
else
if sWJLX = '.BMP' then
pExport := CoExportBMP.Create as IExport
else
if sWJLX = '.GIF' then
pExport := CoExportGIF.Create as IExport
else
if sWJLX = '.PDF' then
pExport := CoExportPDF.Create as IExport
else
if sWJLX = '.PNG' then
pExport := CoExportPNG.Create as IExport
else
if sWJLX = '.SVG' then
pExport := CoExportEMF.Create as IExport
else
if RightStr(sWJLX, ) = '.AI' then
pExport := CoExportAI.Create as IExport
else
if sWJLX = '.EPS' then
pExport := CoExportPS.Create as IExport
else
pExport := CoExportJPEG.Create as IExport; pAV.Get_ScreenDisplay(pSD);
pSD.Get_DisplayTransformation(pDT);
(pDT as IOutputRasterSettings).Get_ResampleRatio(iPrevOutputImageQuality); tmpDC:= GetDC();
iScreenResolution:= GetDeviceCaps(tmpDC, ); //获取屏幕dpi
ReleaseDC(, tmpDC); // 根据传入的pExtent确定裁图的画布大小(出图比例尺下裁图范围的像素高和宽)
pExtent.Get_Width(dWidth);
pExtent.Get_Height(dHeight);
ptagTmp.left := ; //ptagTmp的right和bottom非常主要
ptagTmp.top := ;
ptagTmp.right := trunc(ConvertMapUnitsToPixels(pAV,dWidth) * iOutResolution / iScreenResolution); //把地图距离转为屏幕像素个数
ptagTmp.bottom := trunc(ConvertMapUnitsToPixels(pAV,dHeight) * iOutResolution / iScreenResolution); pEnvNew:= CoEnvelope.Create as IEnvelope;
pEnvNew.PutCoords(ptagTmp.left,ptagTmp.top,ptagTmp.right,ptagTmp.bottom); //裁图的画布大小 pExport.Set_ExportFileName(strPicFile);
pExport.Set_Resolution(iOutResolution);
pExport.Set_PixelBounds(pEnvNew);
if sWJLX = '.TIF' then
begin
if bGeoTiff then
begin
(pExport as IExportTIFF).Set_GeoTiff(True);//包含tif文件坐标信息,这2句是必须的
(pExport as IWorldFileSettings).Set_MapExtent(pExtent);
end;
(pExport as IExportTIFF).Set_CompressionType(pTifCompressionType);
end; if sWJLX = '.PDF' then
begin
(pExport as IExportPDF).Set_Compressed(True);
(pExport as IExportPDF).Set_EmbedFonts(True);
(pExport as IExportPDF).Set_ImageCompression(esriExportImageCompressionNone);
end; pExport.StartExporting(ihdc);
pAV.Output(ihdc, iOutResolution, ptagTmp, pExtent, nil);
pExport.FinishExporting; pExport.Cleanup;
(pDT as IOutputRasterSettings).Set_ResampleRatio(iPrevOutputImageQuality); if FileExists(strPicFile) then
Result:= True;
except
Result:= False;
end;
end;
 
C#版本:
/* GDI delegate to GetDeviceCaps function */

        [DllImport("GDI32.dll")]

        public static extern int GetDeviceCaps(int hdc, int nIndex);

        /* User32 delegates to getDC and ReleaseDC */

        [DllImport("User32.dll")]

        public static extern int GetDC(int hWnd);

        [DllImport("User32.dll")]

        public static extern int ReleaseDC(int hWnd, int hDC);

        [DllImport("user32.dll", SetLastError = true)]

        static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref int pvParam, uint fWinIni);

        /// <summary>

        /// 地图距离转屏幕像素数,不同缩放比例尺下同样距离对应像素数不同的,有特殊需要时设置sMapBLC

        /// </summary>

        /// <param name="pAV">The p AV.</param>

        /// <param name="dMapUnits">地图距离</param>

        /// <returns></returns>

        public static double ConvertMapUnitsToPixels(IActiveView pAV, double dMapUnits)

        {

            IDisplayTransformation pDT = pAV.ScreenDisplay.DisplayTransformation;

            tagRECT pDeviceFrame = pDT.get_DeviceFrame();

            int iDeviceLeft = pDeviceFrame.left;

            int iDeviceRight = pDeviceFrame.right;

            int iPixelExtent = iDeviceRight-iDeviceLeft;

            double dRealWorldExtent = pAV.Extent.Width;

            double dSizeOfEachPixel = dRealWorldExtent / iPixelExtent;

            return dMapUnits / dSizeOfEachPixel;

        }

        /// <summary>

        /// 指定范围裁剪图片

        /// </summary>

        /// <param name="pMap">裁图地图窗口</param>

        /// <param name="pExtent">指定裁图范围</param>

        /// <param name="strPicFile">输出文件名称</param>

        /// <param name="iOutResolution">输出DPI</param>

        public static void ClipMap2Pic(IMap pMap, IEnvelope pExtent, string strPicFile, int iOutResolution, double blc, bool withWarning)

        {

            if (pMap == null) return;

            if (strPicFile == string.Empty) return;

            if (File.Exists(strPicFile))

            {

                if ((!withWarning) || (withWarning && (GtMap.GxFrame.GxFrameLib.Common.AxMessageBox.ShowConfirmation("图片已存在,是否覆盖?") == System.Windows.Forms.DialogResult.Yes)))

                    File.Delete(strPicFile);

                else

                    return;

            }

            IActiveView pAV = pMap as IActiveView;

            string sWJLX = strPicFile.Substring(strPicFile.Length - ).ToUpper();

            IExport pExport = null; 

            if (sWJLX == ".TIF")            //根据文件名后4位判断输出类型

                pExport = new ExportTIFFClass();

            else

            if (sWJLX == ".EMF")

                pExport = new ExportEMFClass();

            else

            if (sWJLX == ".BMP")

                pExport = new ExportBMPClass();

            else

            if (sWJLX == ".GIF")

                pExport = new ExportGIFClass();

            if (sWJLX == ".PDF")

                pExport = new ExportPDFClass();

            else

            if (sWJLX == ".PNG")

                pExport = new ExportPNGClass();

            else

            if (sWJLX == ".SVG")

                pExport = new ExportSVGClass();

            else

            if (strPicFile.Substring(strPicFile.Length - ).ToUpper() == ".AI")

                pExport = new ExportAIClass();

            else

            if (sWJLX == ".EPS")

                pExport = new ExportPSClass();

            else

                pExport = new ExportJPEGClass();

            IDisplayTransformation pDT = pAV.ScreenDisplay.DisplayTransformation;

            IOutputRasterSettings docOutputRasterSettings = pDT as IOutputRasterSettings;

            int iPrevOutputImageQuality = docOutputRasterSettings.ResampleRatio;

            docOutputRasterSettings.ResampleRatio = ;  ////这个似乎没什么用

            //获取屏幕dpi

            /* Get the device context of the screen */

            long tmpDC = GetDC();

            /* Get the screen resolution. */

            int iScreenResolution = GetDeviceCaps((int)tmpDC, ); //88 is the win32 const for Logical pixels/inch in X)

            /* release the DC. */

            ReleaseDC(, (int)tmpDC);

            // 根据传入的pExtent确定裁图的画布大小(出图比例尺下裁图范围的像素高和宽)

            tagRECT ptagTmp;

            ptagTmp.left = ; //ptagTmp的right和bottom非常主要

            ptagTmp.top = ;

            ptagTmp.right = (int)Math.Truncate(ConvertMapUnitsToPixels(pAV,pExtent.Width) * iOutResolution / iScreenResolution); //把地图距离转为屏幕像素个数

            ptagTmp.bottom = (int)Math.Truncate(ConvertMapUnitsToPixels(pAV,pExtent.Height) * iOutResolution / iScreenResolution);

            IEnvelope pEnvNew = new EnvelopeClass();

            pEnvNew.PutCoords(ptagTmp.left,ptagTmp.top,ptagTmp.right,ptagTmp.bottom); //裁图的画布大小

            pExport.ExportFileName = strPicFile;

            pExport.Resolution = iOutResolution;

            pExport.PixelBounds = pEnvNew;

            if (sWJLX == ".TIF")

            {

                (pExport as IExportTIFF).GeoTiff = true;//包含tif文件坐标信息,这2句是必须的

                (pExport as IWorldFileSettings).MapExtent = pExtent;

                (pExport as IExportTIFF).CompressionType = esriTIFFCompression.esriTIFFCompressionJPEG;

            }

            if (sWJLX == ".PDF")

            {

              (pExport as IExportPDF).Compressed = true;

              (pExport as IExportPDF).EmbedFonts = true;

              (pExport as IExportPDF).ImageCompression = esriExportImageCompression.esriExportImageCompressionNone;

            }

            int ihdc = pExport.StartExporting();

            pAV.Output(ihdc, iOutResolution, ref ptagTmp, pExtent, null);

            pExport.FinishExporting();

            pExport.Cleanup();

            (pDT as IOutputRasterSettings).ResampleRatio = iPrevOutputImageQuality;

            if (!File.Exists(strPicFile) && withWarning)

                GtMap.GxFrame.GxFrameLib.Common.AxMessageBox.ShowInformation("图片导出失败!");

        }

//created by jhlong http://jhlong12345.blog.163.com/

ArcEngine地图窗口指定区域导出指定DPI多格式---delphi/C#实现的更多相关文章

  1. 微信小程序导出当前画布指定区域的内容并生成图片保存到本地相册(canvas)

    最近在学小程序,在把当前画布指定区域的内容导出并生成图片保存到本地这个知识点上踩坑了. 这里用到的方法是: wx.canvasToTempFilePath(),该方法作用是把当前画布指定区域的内容导出 ...

  2. 地图 SDK 系列教程-在地图上展示指定区域(转载)

    腾讯位置服务地图SDK是一套提供多种地理位置服务的应用程序接口.通过调用该接口,开发者可以在自己的应用中加入地图相关的功能(如地图展示.标注.绘制图形等),轻松访问腾讯地图服务和数据,构建功能丰富.交 ...

  3. web页面实现指定区域打印功能

    web页面实现指定区域打印功能 使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内. 详细如下: <style media=print type="t ...

  4. 打印web页面指定区域的三种方法

    本文和大家分享一下web页面实现指定区域打印功能的三种方法,一起来看下吧. 第一种方法:使用CSS 定义一 个.noprint的class,将不打印的内容放入这个class内. 代码如下: <s ...

  5. Android DIY之路 (一) 指定区域多图片合成 放大 缩小 镜像 旋转 等(转)

    惯例先看效果图 // 注意做类似这种模板功能时候 方位由后台数据提供,这里我们用假数据 4个点 或者xy 加区域来做示例 //一开始我们公司用的是透明盖住 操作图片 但发现 局限性较大.后来直接限定区 ...

  6. html2canvas实现截取指定区域或iframe的区域

    官网文档: http://html2canvas.hertzen.com/ 使用的是 jquery 3.2.1   html2canvas 1.0.0-rc.7 截取根据id的指定区域: var ca ...

  7. img只显示图片一部分 或 css设置背景图片只显示图片指定区域

    17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...

  8. MySQL 如何只导出 指定的表 的表结构和数据 ( 转 )

    MySQL 如何只导出 指定的表 的表结构和数据 ( 转 ) 2011-01-04 15:03:33 分类: MySQL MySQL 如何只导出 指定的表 的表结构和数据 导出更个库的表结构如下:my ...

  9. 从SVN导出指定版本号之间修改的文件

    当一个网站项目进入运营维护阶段以后,不会再频繁地更新全部源文件到服务器,这个时间的修改大多是局部的,因此更新文件只需更新修改过的文件,其他 没有修改过的文件就没有必要上载到服务器.但一个稍微上规模的网 ...

随机推荐

  1. Java 流(Stream)、文件(File)和IO

    Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多种格式,比如:基本类型.对象.本地化字符集等等. 一个流可以理解为一个数据的序 ...

  2. Java通过几种经典的算法来实现数组排序

    Java实现数组排序 package com.souvc.hibernate.exp; public class MySort { /** * 方法名:main</br> * 详述:Jav ...

  3. 【转载】Linux 文件系统的目录结构

    /bin 基础系统所需要的那些命令位于此目录,也是最小系统所需要的命令:比如 ls.cp.mkdir等命令:功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令.做为基础 ...

  4. iptables详解

    Netfilter包含有三种表,三种表下共包含有五种链,链下面包含各种规则.即表包含若干链,链包含若干规则.  (一)三种表为:filter   nat  mangle 1.filter:处理与本机有 ...

  5. 【Windows编程】系列第二篇:Windows SDK创建基本控件

    在Win32 SDK环境下,怎么来创建常用的那些基本控件呢?我们知道如果用MFC,简单的拖放即可完成大多数控件的创建,但是我们既然是用Windows SDK API编程,当然是从根上解决这个问题,实际 ...

  6. Java基础知识笔记(一:修饰词、向量、哈希表)

    一.Java语言的特点(养成经常查看Java在线帮助文档的习惯) (1)简单性:Java语言是在C和C++计算机语言的基础上进行简化和改进的一种新型计算机语言.它去掉了C和C++最难正确应用的指针和最 ...

  7. POJ 1273 Drainage Ditches题解——S.B.S.

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 67823   Accepted: 2620 ...

  8. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  9. 三维网格补洞算法(Radial Basis Function)

    在逆向工程中,由于设备或模型的原因,我们获取得到的三维模型数据往往并不完整,从而使得生成的网格模型存在孔洞,这对后续的模型分析会造成影响.下面介绍一种基于径向基函数(RBF:Radial Basis ...

  10. return false

    ”return false“到底做了什么? 当你每次调用”return false“的时候,它实际上做了3件事情: •event.preventDefault();•event.stopPropaga ...