FAQ
ArcObjects でアクティブ ビューをエクスポートする方法

ナレッジ番号:2742 | 登録日:2023/05/29 | 更新日:2023/12/28

概要

アクティブ ビューをファイルにエクスポートする方法を示します。ファイルにエクスポートするには、エクスポートしたい形式に合わせて IExport を実装したクラスをインスタンス化します。出力解像度を指定し、出力範囲を決めるための Envelope オブジェクトを用意します。このとき、出力範囲はアクティブ ビューの単位に基づくので、データ ビューの場合はマップの座標単位(緯度経度、もしくは距離)、レイアウト ビューの場合は用紙サイズを指定します。

そして出力画像のピクセル サイズを計算した Envelope オブジェクトを定義し、IExport::StartExporting メソッドを実行します。ここで返される値(デバイス コンテキスト)を含め、先に定義した情報を IActiveView::Output メソッドの引数に指定して出力イメージを作成します。

最後に、IExport::FinishExporting メソッド、IExport::Cleanup メソッドを実行して操作を完了します。

サンプル コード

アクティブなビューを出力ファイル フルパス名に記載されたファイルの拡張子によって形式別に出力するサンプルです。このサンプルで指定できる形式は、PNG、PDF、JPG のいずれかですが、インスタンス化するクラスを変更すれば、サポートする他の形式でマップをエクスポートすることができます。

メソッドの引数に各パラメーターを設定して呼び出してください。

/// <summary>
/// マップのエクスポート
/// </summary>
/// <param name="ActiveView">アクティブ ビュー</param>
/// <param name="FileName">出力ファイル フルパス名</param>
/// <param name="Resolution">解像度</param>
/// <param name="DPI">画面密度</param>
/// <remarks></remarks>
public void ExportImageFromActiveView(IActiveView ActiveView, string FileName, int Resolution, int DPI = 96)
{
    //ベース ディレクトリ・ファイル名・拡張子の取得
    string strDirName = System.IO.Path.GetDirectoryName(FileName);
    string strBaseName = System.IO.Path.GetFileNameWithoutExtension(FileName);
    string strExtName = System.IO.Path.GetExtension(FileName);

    IOutputRasterSettings pOutputRasterSettings = (IOutputRasterSettings)ActiveView.ScreenDisplay.DisplayTransformation;
    pOutputRasterSettings.ResampleRatio = 1; //ラスターのピクセル比率を1に変更

    IExport pExport = default(IExport);

    //エクスポート形式の選択(TIFF、JPG、PDF、PNG のみ、判別不能の場合は JPG 形式で出力)
    switch (strExtName.ToUpper())
    {
        case ".TIF":
            pExport = new ExportTIFFClass();
            FileName = strDirName + "\\" + strBaseName + ".tif";
            break;
        case ".PNG":
            pExport = new ExportPNGClass();
            FileName = strDirName + "\\" + strBaseName + ".png";
            break;
        case ".PDF":
            pExport = new ExportPDFClass();
            FileName = strDirName + "\\" + strBaseName + ".pdf";
            IExportPDF pExporterPDF = (IExportPDF)pExport;
            pExporterPDF.EmbedFonts = true;
            break;
        default:
            pExport = new ExportJPEGClass();
            FileName = strDirName + "\\" + strBaseName + ".jpg";
            break;
    }

    IEnvelope pVisibleBounds = null;
    if (ActiveView is IMap)
    {
        //データ ビューの場合
        //pVisibleBounds.PutCoords(135, 35, 140, 40)     //任意の座標範囲でエクスポートする場合
        pVisibleBounds = ActiveView.Extent;
    }
    else
    {
        IPageLayout pPageLayout = (IPageLayout)ActiveView;
        IPage pPage = pPageLayout.Page;

        double width;
        double height;
        pPage.QuerySize(out width, out height);

        pVisibleBounds = new EnvelopeClass();
        pVisibleBounds.PutCoords(0, 0, width, height);

    }

    tagRECT rectOut;
    rectOut = ActiveView.ExportFrame;
    rectOut.left = 0;
    rectOut.top = 0;
    rectOut.right = rectOut.right * (int)(pExport.Resolution / DPI);
    rectOut.bottom = rectOut.bottom * (int)(pExport.Resolution / DPI);

    IEnvelope pPixelBounds = new EnvelopeClass();
    pPixelBounds.PutCoords(rectOut.left, rectOut.top, rectOut.right, rectOut.bottom);

    pExport.ExportFileName = FileName;
    pExport.PixelBounds = pPixelBounds;
    pExport.Resolution = Resolution;

    //エクスポートの実行
    int hDc = pExport.StartExporting();
    ActiveView.Output(hDc, (int)pExport.Resolution, rectOut, pVisibleBounds, null);
    pExport.FinishExporting();
    pExport.Cleanup();

    System.Windows.Forms.MessageBox.Show("マップのエクスポートが完了しました。" + System.Environment.NewLine + FileName, "マップのエクスポート");

}
''' <summary>
''' マップのエクスポート
''' </summary>
''' <param name="ActiveView">アクティブ ビュー</param>
''' <param name="FileName">出力ファイル フルパス名</param>
''' <param name="Resolution">解像度</param>
''' <param name="DPI">画面密度</param>
''' <remarks></remarks>
Public Sub ExportImageFromActiveView(ActiveView As ActiveView, FileName As String, Resolution As Integer, Optional DPI As Integer = 96)

    'ベース ディレクトリ・ファイル名・拡張子の取得
    Dim strDirName As String = System.IO.Path.GetDirectoryName(FileName)
    Dim strBaseName As String = System.IO.Path.GetFileNameWithoutExtension(FileName)
    Dim strExtName As String = System.IO.Path.GetExtension(FileName)

    Dim pOutputRasterSettings As IOutputRasterSettings = CType(ActiveView.ScreenDisplay.DisplayTransformation, IOutputRasterSettings)
    pOutputRasterSettings.ResampleRatio = 1     'ラスターのピクセル比率を1に変更

    Dim pExport As IExport

    'エクスポート形式の選択(TIFF、JPG、PDF、PNG のみ、判別不能の場合は JPG 形式で出力)
    Select Case strExtName.ToUpper()
        Case ".TIF"
            pExport = New ExportTIFFClass()
            FileName = strDirName & "\" & strBaseName & ".tif"
        Case ".PNG"
            pExport = New ExportPNGClass()
            FileName = strDirName & "\" & strBaseName & ".png"
        Case ".PDF"
            pExport = New ExportPDFClass()
            FileName = strDirName & "\" & strBaseName & ".pdf"
            Dim pExporterPDF As IExportPDF = CType(pExport, IExportPDF)
            pExporterPDF.EmbedFonts = True
        Case Else
            pExport = New ExportJPEGClass()
            FileName = strDirName & "\" & strBaseName & ".jpg"
    End Select

    '出力地図範囲
    Dim pVisibleBounds As IEnvelope = Nothing

    If TypeOf ActiveView Is IMap Then
        'データ ビューの場合
        'pVisibleBounds.PutCoords(135, 35, 140, 40)     '任意の座標範囲でエクスポートする場合
        pVisibleBounds = ActiveView.Extent
    Else
        'レイアウト ビューの場合
        Dim pPageLayout As IPageLayout = CType(ActiveView, IPageLayout)
        Dim pPage As IPage = pPageLayout.Page

        Dim width As Double
        Dim height As Double
        pPage.QuerySize(width, height)   '用紙サイズ取得

        pVisibleBounds = New EnvelopeClass()
        pVisibleBounds.PutCoords(0, 0, width, height)
    End If

    Dim rectOut As tagRECT = ActiveView.ExportFrame
    rectOut.left = 0
    rectOut.top = 0
    rectOut.right = rectOut.right * pExport.Resolution / DPI
    rectOut.bottom = rectOut.bottom * pExport.Resolution / DPI

    Dim pPixelBounds As IEnvelope = New EnvelopeClass()
    pPixelBounds.PutCoords(rectOut.left, rectOut.top, rectOut.right, rectOut.bottom)

    pExport.ExportFileName = FileName
    pExport.PixelBounds = pPixelBounds
    pExport.Resolution = Resolution

    'エクスポートの実行
    Dim hDc As Long = pExport.StartExporting
    ActiveView.Output(hDc, Resolution, rectOut, pVisibleBounds, Nothing)
    pExport.FinishExporting()

    System.Windows.Forms.MessageBox.Show("マップのエクスポートが完了しました。" & System.Environment.NewLine & FileName, "マップのエクスポート")

End Sub

参考

IActiveView.Output Method (ArcObjects API Reference for .NET)

メタデータ

種類

製品