|
NXPlanetViewCaptureScreenByBlock(String, Int32, Int32, Int32, Int32, Int32, Int32, XFrameCaptureBuffereCaptureMode, NXPlanetView, String, XThread) Method
|
Planet View에 도시되어 있는 내용을 임시 PlanetView 를 이용하여 해상도 조절하여 저장한다.
임시 PlanetView 의 Width, Height 는 256 보다 큰 값으로 각각 설정한다.
Planet2D 모드에서만 가능
Namespace: Pixoneer.NXDL.NXPlanetAssembly: NXPlanet (in NXPlanet.dll) Version: 2.0.3.38
Syntaxpublic bool CaptureScreenByBlock(
string outputPath,
int nX1,
int nX2,
int nY1,
int nY2,
int nOutNX,
int nOutNY,
XFrameCaptureBuffereCaptureMode mode,
NXPlanetView blockView,
out string strErr,
XThread thd
)
Parameters
- outputPath String
- 출력 경로
- nX1 Int32
- 캡쳐할 범위의 X축 방향 최소값(스크린 좌표)
- nX2 Int32
- 캡쳐할 범위의 X축 방향 최대값(스크린 좌표)
- nY1 Int32
- 캡쳐할 범위의 Y축 방향 최소값(스크린 좌표)
- nY2 Int32
- 캡쳐할 범위의 Y축 방향 최대값(스크린 좌표)
- nOutNX Int32
- X 방향의 출력 영상 크기(폭, 단위 : 화소)
- nOutNY Int32
- Y 방향의 출력 영상 크기(높이, 단위 : 화소)
- mode XFrameCaptureBuffereCaptureMode
- 캡처 모드
- blockView NXPlanetView
- 메인 PlanetView 의 내용을 block 별로 임시 도시하기 위한 임의의 PlanetView(Width, Height 는 300으로 설정)
- strErr String
- 화면 캡쳐를 하지 못하는 경우, 이에 대한 에러 메시지
- thd XThread
- 프로세싱 쓰레드(null 가능)
Return Value
Boolean화면을 캡쳐하여 출력경로로 저장하면 true를, 아니면 false를 반환
Example
메인 PlanetView 의 화면을 임시 PlanetView 에 block 별로 도시 및 캡쳐하는 예제
<Window x:Class="CaptureScreen_WPF.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns : d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns : mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns : nxPlanet = "clr-namespace:Pixoneer.NXDL.NXPlanet;assembly=NXPlanet"
xmlns : local = "clr-namespace:CaptureScreen_WPF"
mc : Ignorable = "d"
Title = "MainWindow" Height = "800" Width = "800"
Loaded = "Window_Loaded" Closed = "Window_Closed" >
<Window.Resources>
<nxPlanet:NXPlanetLayer x : Name = "PlanetLayer" x : Key = "KeyPlanetLayer" / >
<nxPlanet:NXPlanetLayerComposites x : Name = "PlanetLayerComposite" x : Key = "KeyPlanetLayerComposite" RenderLikeBaseMap = "True" / >
< / Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height = "20" / >
<RowDefinition Height = "*" / >
< / Grid.RowDefinitions>
<Menu Grid.Row = "0">
<MenuItem Header = "열기" x:Name = "menuOpen" Click = "menuOpen_Click" / >
<MenuItem Header = "필터링">
<MenuItem Header = "None" x:Name = "menuFilterNone" Click = "menuFilter_Click" / >
<MenuItem Header = "Sharpen" x:Name = "menuFilterSharpen" Click = "menuFilter_Click" / >
<MenuItem Header = "Basso" x:Name = "menuFilterBasso" Click = "menuFilter_Click" / >
< / MenuItem>
<MenuItem Header = "화면캡쳐(Visible)" x:Name = "menuCaptureVisible" Click = "menuCaptureVisible_Click" / >
<MenuItem Header = "화면캡쳐(Unvisible)" x:Name = "menuCaptureUnvisible" Click = "menuCaptureUnvisible_Click" / >
< / Menu>
<Grid Grid.Row = "1">
<WindowsFormsHost>
<nxPlanet:NXPlanetView x : Name = "PlanetView" / >
< / WindowsFormsHost>
< / Grid>
< / Grid>
< / Window>
using Microsoft.Win32;
using Pixoneer.NXDL;
using Pixoneer.NXDL.NGR;
using Pixoneer.NXDL.NIO;
using Pixoneer.NXDL.NRS;
using Pixoneer.NXDL.NXPlanet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace CaptureScreen_WPF
{
public partial class MainWindow : Window
{
public XRasterIO RasterIO;
public XRSLoadFile InputFile;
public XDMCompManager CompMng = null;
public NXPlanetLayerComposites PlanetLayerComposite = null;
public string SaveFilePath;
public MainWindow()
{
InitializeComponent();
string strError;
RasterIO = new XRasterIO();
if (RasterIO.Initialize(out strError) == false)
{
MessageBox.Show(strError);
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
PlanetView.EarthMode = NXPlanetView.eEarthMode.Planet2D;
PlanetView.GridType = NXPlanetView.eGridType.GridDegrees;
PlanetView.ShowStar = false;
PlanetView.ShowGrid = false;
PlanetView.ShowStatusInfo = false;
PlanetView.ShowPBP = false;
PlanetView.Rotatable = true;
PlanetView.InverseMouseButton = true;
PlanetView.InverseMouseWheel = true;
PlanetView.AutoFocus = false;
PlanetView.ZoomWheelMode = eViewZoomMode.ZoomStatic;
PlanetView.ZoomWheelStaticFactor = 1.0;
NXCameraState camState = PlanetView.GetCameraState();
XGeoPoint geoCenter = XGeoPoint.FromDegree(127.2845, 36.3677, 0);
if (PlanetView.Planet2DProjection == NXPlanetView.ePlanet2DProjection.WebMercator)
{
camState.eye = geoCenter.wm;
}
else
{
camState.eye = geoCenter.eec;
}
PlanetView.SetCameraState(camState);
double alt = PlanetView.GetMapAltitude(200000);
geoCenter.hgt = alt;
PlanetView.SetCameraPosition(geoCenter, XAngle.FromDegree(0));
double maxHeight = PlanetView.GetMapAltitude(50000000);
double minHeight = PlanetView.GetMapAltitude(10);
PlanetView.MaxZoomIn(true, minHeight);
PlanetView.MaxZoomOut(true, maxHeight);
if (PlanetView.LayerCount <= 0)
{
PlanetLayerComposite = FindResource("KeyPlanetLayerComposite") as NXPlanetLayerComposites;
NXRenderLayer renderPlanetLayerComposite = PlanetLayerComposite;
NXPlanetLayer planetLayer = FindResource("KeyPlanetLayer") as NXPlanetLayer;
PlanetView.AddRenderLayer(ref renderPlanetLayerComposite);
PlanetView.AddRenderLayer(ref planetLayer);
CompMng = PlanetLayerComposite.GetXDMCompManager();
}
PlanetView.Brightness = 2.0f;
PlanetView.Contrast = 1.5f;
PlanetView.Saturation = 0.7f;
}
private void Window_Closed(object sender, EventArgs e)
{
if (InputFile != null)
InputFile.Dispose();
InputFile = null;
Xfn.Close();
}
private void menuOpen_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "all file(*.*)|*.*||";
openFileDialog.RestoreDirectory = true;
Nullable<bool> result = openFileDialog.ShowDialog();
if (result != true) return;
string strFilePath = openFileDialog.FileName;
string strError;
XRSLoadFile xrsFile = RasterIO.LoadFile(strFilePath, out strError, false, eIOCreateXLDMode.All_NoMsg);
if (xrsFile == null) return;
ClearView();
AddXDMComposite(xrsFile);
if (InputFile != null)
{
InputFile.Dispose();
InputFile = null;
}
InputFile = xrsFile;
}
private void menuFilter_Click(object sender, RoutedEventArgs e)
{
MenuItem menu = sender as MenuItem;
if (menu.Name == "menuFilterNone")
{
PlanetLayerComposite.SetFilterType(eImageProcessingFilter.None);
PlanetLayerComposite.EnableShaderAlgorithm(false);
}
else if (menu.Name == "menuFilterSharpen")
{
PlanetLayerComposite.SetFilterType(eImageProcessingFilter.SHARPEN);
PlanetLayerComposite.SetFilterSize(7);
PlanetLayerComposite.EnableShaderAlgorithm(true);
}
else if (menu.Name == "menuFilterBasso")
{
PlanetLayerComposite.SetFilterType(eImageProcessingFilter.BASSO);
PlanetLayerComposite.EnableShaderAlgorithm(true);
}
}
private void menuCaptureVisible_Click(object sender, RoutedEventArgs e)
{
string saveClipImgName = DateTime.Now.ToString("yyyyMMdd_HH_mm_ss_ffff") + ".xdm";
string saveFolderTemp = AppDomain.CurrentDomain.BaseDirectory.ToString();
SaveFilePath = System.IO.Path.Combine(saveFolderTemp, saveClipImgName);
int outSizeX = PlanetView.Width * 2;
int outSizeY = PlanetView.Height * 2;
Win_PlanetViewForCapture winTempView = new Win_PlanetViewForCapture();
winTempView.CaptureEnd += WinTempView_CaptureEnd;
winTempView.SetVisibleViewFlag(true);
winTempView.CompMng = this.CompMng;
winTempView.OutSizeX = outSizeX;
winTempView.OutSizeY = outSizeY;
winTempView.SaveFilePath = SaveFilePath;
winTempView.ViewBrightness = PlanetView.Brightness;
winTempView.ViewContrast = PlanetView.Contrast;
winTempView.ViewSaturation = PlanetView.Saturation;
winTempView.CompositeLayerFilterType = PlanetLayerComposite.GetFilterType();
winTempView.CompositeLayerFilterSize = PlanetLayerComposite.GetFilterSize();
winTempView.ParentPlanetView = PlanetView;
winTempView.X1 = 0;
winTempView.X2 = PlanetView.Width;
winTempView.Y1 = 0;
winTempView.Y2 = PlanetView.Height;
winTempView.Show();
}
private void menuCaptureUnvisible_Click(object sender, RoutedEventArgs e)
{
string saveClipImgName = DateTime.Now.ToString("yyyyMMdd_HH_mm_ss_ffff") + ".xdm";
string saveFolderTemp = AppDomain.CurrentDomain.BaseDirectory.ToString();
SaveFilePath = System.IO.Path.Combine(saveFolderTemp, saveClipImgName);
int outSizeX = PlanetView.Width * 2;
int outSizeY = PlanetView.Height * 2;
Win_PlanetViewForCapture winTempView = new Win_PlanetViewForCapture();
winTempView.CaptureEnd += WinTempView_CaptureEnd;
winTempView.SetVisibleViewFlag(false);
winTempView.CompMng = this.CompMng;
winTempView.OutSizeX = outSizeX;
winTempView.OutSizeY = outSizeY;
winTempView.SaveFilePath = SaveFilePath;
winTempView.ViewBrightness = PlanetView.Brightness;
winTempView.ViewContrast = PlanetView.Contrast;
winTempView.ViewSaturation = PlanetView.Saturation;
winTempView.CompositeLayerFilterType = PlanetLayerComposite.GetFilterType();
winTempView.CompositeLayerFilterSize = PlanetLayerComposite.GetFilterSize();
winTempView.ParentPlanetView = PlanetView;
winTempView.X1 = 0;
winTempView.X2 = PlanetView.Width;
winTempView.Y1 = 0;
winTempView.Y2 = PlanetView.Height;
winTempView.Show();
}
private void ClearView()
{
PlanetLayerComposite.Lock();
for (int i = 0; i < CompMng.NumComp; i++)
{
XDMComposite comp = CompMng.GetXDMCompositeAt(i);
comp.Dispose();
}
CompMng.RemoveXDMCompositeAll();
PlanetLayerComposite.Invalidate();
PlanetLayerComposite.UnLock();
PlanetView.RefreshScreen();
}
private void AddXDMComposite(XRSLoadFile xrsFile)
{
PlanetLayerComposite.Lock();
XDMComposite newComp = new XDMComposite();
int nNumBand = xrsFile.NumBand;
if (nNumBand < 3)
{
XDMBand band = xrsFile.GetBandAt(0);
newComp.Mode = eCompMode.Gray;
newComp.SetBand(ref band, 0);
newComp.SetCutType(eCompCutType.Ct98, 0);
newComp.SetStretchCoverage(eCompStretchCoverage.Band, 0);
newComp.SetStretchType(eCompStretchType.Linear, 0);
}
else
{
XDMBand band1 = xrsFile.GetBandAt(0);
XDMBand band2 = xrsFile.GetBandAt(1);
XDMBand band3 = xrsFile.GetBandAt(2);
newComp.Mode = eCompMode.RGB;
newComp.SetBand(ref band3, 0);
newComp.SetBand(ref band2, 1);
newComp.SetBand(ref band1, 2);
for (int i = 0; i < 3; i++)
{
newComp.SetCutType(eCompCutType.Ct98, i);
newComp.SetStretchCoverage(eCompStretchCoverage.Band, i);
newComp.SetStretchType(eCompStretchType.Linear, i);
}
}
CompMng.AddXDMComposite(ref newComp);
PlanetLayerComposite.ZoomFit();
PlanetLayerComposite.UnLock();
PlanetView.RefreshScreen();
}
private void WinTempView_CaptureEnd(object sender, EventArgs e)
{
if (((CaptureEndEventArgs)e).IsSuccess)
{
MessageBox.Show(SaveFilePath);
}
else
{
MessageBox.Show(((CaptureEndEventArgs)e).Err);
}
}
}
}
<Window x:Class="CaptureScreen_WPF.Win_PlanetViewForCapture"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns : d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns : mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns : nxPlanet = "clr-namespace:Pixoneer.NXDL.NXPlanet;assembly=NXPlanet"
xmlns : local = "clr-namespace:CaptureScreen_WPF"
mc : Ignorable = "d"
Title = "Win_PlanetViewForCapture" Height = "450" Width = "800"
Loaded = "Window_Loaded" Closed = "Window_Closed"
IsVisibleChanged = "Window_IsVisibleChanged" >
<Window.Resources>
<nxPlanet:NXPlanetLayer x : Name = "PlanetLayer" x : Key = "KeyPlanetLayerCapture" OnRender = "PlanetLayer_OnRender" / >
<nxPlanet:NXPlanetLayerComposites x : Name = "PlanetLayerComposite" x : Key = "KeyPlanetLayerCompositeCapture" RenderLikeBaseMap = "True" / >
< / Window.Resources>
<Grid>
<WindowsFormsHost>
<nxPlanet:NXPlanetView x : Name = "PlanetView" / >
< / WindowsFormsHost>
< / Grid>
< / Window>
using Pixoneer.NXDL;
using Pixoneer.NXDL.NGR;
using Pixoneer.NXDL.NRS;
using Pixoneer.NXDL.NXPlanet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Threading;
using static Pixoneer.NXDL.NGR.XFrameCaptureBuffer;
namespace CaptureScreen_WPF
{
public partial class Win_PlanetViewForCapture : Window
{
private NXPlanetLayerComposites _planetLayerComposite = null;
private Thread _threadCapture = null;
private bool _isApplyedEnhance = false;
private bool _isRendered = false;
private bool _isCaptured = false;
private string _strError = string.Empty;
private bool _isVisibleView = true;
public event EventHandler CaptureEnd;
public XDMCompManager CompMng = null;
public int OutSizeX = 0;
public int OutSizeY = 0;
public string SaveFilePath = "";
public float ViewBrightness = 1.0f;
public float ViewContrast = 1.0f;
public float ViewSaturation = 1.0f;
public eImageProcessingFilter CompositeLayerFilterType = eImageProcessingFilter.None;
public int CompositeLayerFilterSize = 0;
public NXPlanetView ParentPlanetView = null;
public int X1 = 0;
public int X2 = 0;
public int Y1 = 0;
public int Y2 = 0;
public Win_PlanetViewForCapture()
{
InitializeComponent();
}
public void SetVisibleViewFlag(bool visible)
{
_isVisibleView = visible;
if (_isVisibleView)
{
ShowInTaskbar = true;
WindowStyle = WindowStyle.SingleBorderWindow;
AllowsTransparency = false;
}
else
{
ShowInTaskbar = false;
WindowStyle = WindowStyle.None;
Background = Brushes.Transparent;
AllowsTransparency = true;
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
PlanetView.Width = 270;
PlanetView.Height = 270;
PlanetView.EarthMode = NXPlanetView.eEarthMode.Planet2D;
PlanetView.GridType = NXPlanetView.eGridType.GridDegrees;
PlanetView.ShowStar = false;
PlanetView.ShowGrid = false;
PlanetView.ShowStatusInfo = false;
PlanetView.ShowPBP = false;
PlanetView.Rotatable = true;
PlanetView.InverseMouseButton = true;
PlanetView.InverseMouseWheel = true;
PlanetView.AutoFocus = false;
PlanetView.ZoomWheelMode = eViewZoomMode.ZoomStatic;
PlanetView.ZoomWheelStaticFactor = 1.0;
PlanetView.ForceDraw = true;
if (PlanetView.LayerCount <= 0)
{
_planetLayerComposite = FindResource("KeyPlanetLayerCompositeCapture") as NXPlanetLayerComposites;
NXRenderLayer renderPlanetLayerComposite = _planetLayerComposite;
NXPlanetLayer planetLayer = FindResource("KeyPlanetLayerCapture") as NXPlanetLayer;
PlanetView.AddRenderLayer(ref renderPlanetLayerComposite);
PlanetView.AddRenderLayer(ref planetLayer);
}
if (CompMng != null)
{
_planetLayerComposite.SetXDMCompManager(ref CompMng);
}
PlanetView.Brightness = ViewBrightness;
PlanetView.Contrast = ViewContrast;
PlanetView.Saturation = ViewSaturation;
_threadCapture = new Thread(new ThreadStart(Capture));
_threadCapture.Start();
}
private void Window_Closed(object sender, EventArgs e)
{
_threadCapture.Abort();
SendEventCaptureEnd();
}
private bool PlanetLayer_OnRender(object sender, Pixoneer.NXDL.NXPlanet.NXPlanetDrawArgs e)
{
if (_isRendered == false)
{
_isRendered = true;
}
if (_isRendered == true && _isApplyedEnhance == false)
{
_planetLayerComposite.SetFilterType(CompositeLayerFilterType);
_planetLayerComposite.SetFilterSize(CompositeLayerFilterSize);
if (CompositeLayerFilterType == eImageProcessingFilter.None)
{
_planetLayerComposite.EnableShaderAlgorithm(false);
}
else
{
_planetLayerComposite.EnableShaderAlgorithm(true);
}
_isApplyedEnhance = true;
}
return true;
}
private void Window_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (_isVisibleView == false)
{
if (this.Visibility == System.Windows.Visibility.Visible)
{
this.Visibility = Visibility.Hidden;
}
}
}
private void Capture()
{
while (true)
{
Thread.Sleep(20);
if (_isRendered == true && _isApplyedEnhance == true)
{
_isCaptured = ParentPlanetView.CaptureScreenByBlock(SaveFilePath, X1, X2, Y1, Y2, OutSizeX, OutSizeY, eCaptureMode.BASEMAP, PlanetView, out _strError, null);
break;
}
}
Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate
{
Close();
}));
}
private void SendEventCaptureEnd()
{
if (CaptureEnd != null)
{
CaptureEndEventArgs param = new CaptureEndEventArgs();
param.IsSuccess = _isCaptured;
param.Err = _strError;
CaptureEnd(this, param);
}
}
}
public class CaptureEndEventArgs : EventArgs
{
public bool IsSuccess
{
get;
set;
}
public string Err
{
get;
set;
}
}
}
See Also