ArcEngine地图窗口指定区域导出指定DPI多格式---delphi/C#实现
{海龙 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;
/* 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#实现的更多相关文章
- 微信小程序导出当前画布指定区域的内容并生成图片保存到本地相册(canvas)
最近在学小程序,在把当前画布指定区域的内容导出并生成图片保存到本地这个知识点上踩坑了. 这里用到的方法是: wx.canvasToTempFilePath(),该方法作用是把当前画布指定区域的内容导出 ...
- 地图 SDK 系列教程-在地图上展示指定区域(转载)
腾讯位置服务地图SDK是一套提供多种地理位置服务的应用程序接口.通过调用该接口,开发者可以在自己的应用中加入地图相关的功能(如地图展示.标注.绘制图形等),轻松访问腾讯地图服务和数据,构建功能丰富.交 ...
- web页面实现指定区域打印功能
web页面实现指定区域打印功能 使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内. 详细如下: <style media=print type="t ...
- 打印web页面指定区域的三种方法
本文和大家分享一下web页面实现指定区域打印功能的三种方法,一起来看下吧. 第一种方法:使用CSS 定义一 个.noprint的class,将不打印的内容放入这个class内. 代码如下: <s ...
- Android DIY之路 (一) 指定区域多图片合成 放大 缩小 镜像 旋转 等(转)
惯例先看效果图 // 注意做类似这种模板功能时候 方位由后台数据提供,这里我们用假数据 4个点 或者xy 加区域来做示例 //一开始我们公司用的是透明盖住 操作图片 但发现 局限性较大.后来直接限定区 ...
- html2canvas实现截取指定区域或iframe的区域
官网文档: http://html2canvas.hertzen.com/ 使用的是 jquery 3.2.1 html2canvas 1.0.0-rc.7 截取根据id的指定区域: var ca ...
- img只显示图片一部分 或 css设置背景图片只显示图片指定区域
17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...
- MySQL 如何只导出 指定的表 的表结构和数据 ( 转 )
MySQL 如何只导出 指定的表 的表结构和数据 ( 转 ) 2011-01-04 15:03:33 分类: MySQL MySQL 如何只导出 指定的表 的表结构和数据 导出更个库的表结构如下:my ...
- 从SVN导出指定版本号之间修改的文件
当一个网站项目进入运营维护阶段以后,不会再频繁地更新全部源文件到服务器,这个时间的修改大多是局部的,因此更新文件只需更新修改过的文件,其他 没有修改过的文件就没有必要上载到服务器.但一个稍微上规模的网 ...
随机推荐
- Solr嵌套子文档的弊端以及一种替代方式
背景:在考察了多种工具后,我们决定使用solr来作为多标签用户管理体系的查询方案. 原计划:电话,call客,跟进等等记录上报到kafka,然后通过flume+morphline录入到solr中.每一 ...
- C/S打包 客户端/windows程序 InstallShield
开发完成后,我们可以直接在Debug目录下启动exe,运行程序. 但是,要如何安装,添加到开始菜单.桌面快捷方式.任务栏等.如Office安装效果: 开始菜单: 快捷菜单: 打包步骤: 1.下载Ins ...
- 帆软报表FineReport中数据连接之Tomcat配置JNDI连接
1. 问题描述 在帆软报表FineReport中,通过JNDI方式定义数据连接,首先在Tomcat服务器配置好JNDI,然后在设计器中直接调用JNDI的名字,即可成功使用JNDI连接,连接步骤如下: ...
- spark on yarn 提交任务出错
Application ID is application_1481285758114_422243, trackingURL: http://***:4040Exception in thread ...
- MMORPG大型游戏设计与开发(服务器 游戏场景 掉落与网络连接)
时间一点点的消逝,伴着自己空闲日子将要结束的时候我尽量的学习和分享场景和AI的知识给朋友们,不过很遗憾的是这些文章还有不足的地方,就是有的难点没有完全的分析到.掉落在游戏中必不可少的,同时网络连接也是 ...
- 06章 映射一对多双向关联关系、以及cascade、inverse属性
当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象.或者通过集合导航到一组对象.例如: 对于给定的Emp对象,如果想获得与它关联的Dept对象,只要调用如下方法 Dept dept=emp ...
- angular学习笔记(二十九)-$q服务
angular中的$q是用来处理异步的(主要当然是http交互啦~). $q采用的是promise式的异步编程.什么是promise异步编程呢? 异步编程最重要的核心就是回调,因为有回调函数,所以才构 ...
- IIS HTTP 错误 404.17 - Not Found HTTP 错误 404.2 解决方法
出现这种情况的原因通常是因为先安装了Framework,后安装的IIS: 解决方法 运行cmd,输入: C:\Windows\Microsoft.NET\Framework\V4.0.30319\as ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 实现缓存预热
因为大型应用系统可能有几十个子系统,为了减轻数据库频繁读写压力.提高系统的运行速度.反映速度,大型应用系统都需要采用缓存机制提高运行效率.Redis 缓存预热实现将来大家很多基础数据都可以缓存获取,不 ...
- Mac--10.8.3下使用apache2方法
在终端使用 sudo apachectl start => 启动apache2 sudo apchectl stop => 停止 sudo apchectl restart => ...