Image ILNumerics:将场景的一部分导出为图像,而不影响原始场景
我用ILNumerics创建了一个场景,它由3个PlotCube和一个颜色条组成 我想添加一个方法,以两种方式将场景导出为图像,第一种是上面看到的屏幕截图。 第二个导出应该只显示以中心为中心的多维数据集 我试图遵循ILNumerics的指导原则 我编写了以下代码:Image ILNumerics:将场景的一部分导出为图像,而不影响原始场景,image,export,scene,ilnumerics,Image,Export,Scene,Ilnumerics,我用ILNumerics创建了一个场景,它由3个PlotCube和一个颜色条组成 我想添加一个方法,以两种方式将场景导出为图像,第一种是上面看到的屏幕截图。 第二个导出应该只显示以中心为中心的多维数据集 我试图遵循ILNumerics的指导原则 我编写了以下代码: public void ExportAsImage(int resolutionWidth, int resolutionHeight, string path, bool includeSubCubes) {
public void ExportAsImage(int resolutionWidth, int resolutionHeight, string path, bool includeSubCubes)
{
using (ILScope.Enter())
{
ILGDIDriver backgroundDriver = new ILGDIDriver(resolutionWidth, resolutionHeight, ilPanel1.Scene);
if (includeSubCubes)
{
// code for standard export here
}
else
{
// setting left and top cube and color bar invisible and
// adjusting main cube size is affecting the ilPanel.Scene
backgroundDriver.Scene.First<ILColorbar>().Visible = false;
GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _leftCubeTag).Visible = false;
GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _topCubeTag).Visible = false;
GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _mainCubeTag).ScreenRect = new RectangleF(0, 0, 1, 1);
GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _mainCubeTag).DataScreenRect = new RectangleF.Empty;
backgroundDriver.Scene.Configure();
backgroundDriver.Render();
// save image
backgroundDriver.BackBuffer.Bitmap.Save(path,System.Drawing.Imaging.ImageFormat.Png);
// revert changes done to cubes and color bar
backgroundDriver.Scene.First<ILColorbar>().Visible = true;
GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _leftCubeTag).Visible = true;
GetElementByTag<ILPlotCube>(backgroundDriver.Scene, _topCubeTag).Visible = true;
AdjustCubeSizes();
}
}
}
public void ExportAsImage(int resolutionWidth、int resolutionHeight、字符串路径、bool includeSubCubes)
{
使用(ILScope.Enter())
{
ILGDIDriver backgroundDriver=新的ILGDIDriver(分辨率宽度、分辨率高度、ilPanel1.Scene);
if(包括子多维数据集)
{
//此处为标准导出代码
}
其他的
{
//设置左侧和顶部立方体以及颜色栏不可见和
//调整主立方体大小会影响ilPanel.Scene
backgroundDriver.Scene.First().Visible=false;
GetElementByTag(backgroundDriver.Scene,_leftCubeTag).Visible=false;
GetElementByTag(backgroundDriver.Scene,_topCubeTag).Visible=false;
GetElementByTag(backgroundDriver.Scene,_mainCubeTag).ScreenRect=新矩形F(0,0,1,1);
GetElementByTag(backgroundDriver.Scene,_mainCubeTag).DataScreenRect=新矩形f.Empty;
backgroundDriver.Scene.Configure();
backgroundDriver.Render();
//保存图像
backgroundDriver.BackBuffer.Bitmap.Save(路径,System.Drawing.Imaging.ImageFormat.Png);
//还原对多维数据集和颜色栏所做的更改
backgroundDriver.Scene.First().Visible=true;
GetElementByTag(backgroundDriver.Scene,_leftCubeTag).Visible=true;
GetElementByTag(backgroundDriver.Scene,_topCubeTag).Visible=true;
调整立方();
}
}
}
注意:“GetElementByTag”是一个自己的实现,用于检索ILNumerics场景中的对象
我首先希望新的驱动程序基本上创建了一个我可以处理的场景副本,但是就像代码显示的那样,我必须在导出后恢复所有更改,或者显示的ilPanel仅以我导出场景的方式显示场景
是否可以在不影响真实场景的情况下导出到图像?我是不是遗漏了一些细节
问候,,
Florian S.Florian,它确实复制了一份。但是您需要将有趣的部分添加到新场景中。神奇的事情发生在Add()方法中:
var scene4render=new ILScene();
scene4render.Add(oldsecene.First(mytag));
// ... 在此处配置scene4render,它将与原始场景分离
//除了共享缓冲区。
// ... 继续渲染
为了还包括对原始绘图立方体的+渲染交互状态更改(例如,用户鼠标旋转),您可以使用以下内容:
scene4render.Add(panel.SceneSyncRoot.First<ILPlotCube>(mytag));
scene4render.Add(panel.SceneSyncRoot.First(mytag));
另外,我想知道什么GetElementByTag
比ILGroup.First(tag,predicate)
或ILGroup.Find(…)
另请参见:Florian,它确实复制了一份。但是您需要将有趣的部分添加到新场景中。神奇的事情发生在Add()方法中:
var scene4render=new ILScene();
scene4render.Add(oldsecene.First(mytag));
// ... 在此处配置scene4render,它将与原始场景分离
//除了共享缓冲区。
// ... 继续渲染
为了还包括对原始绘图立方体的+渲染交互状态更改(例如,用户鼠标旋转),您可以使用以下内容:
scene4render.Add(panel.SceneSyncRoot.First<ILPlotCube>(mytag));
scene4render.Add(panel.SceneSyncRoot.First(mytag));
另外,我想知道什么GetElementByTag
比ILGroup.First(tag,predicate)
或ILGroup.Find(…)
另请参见:谢谢。这似乎正是我遗漏的代码部分。我们使用“GetElementByTag”,因为一些测试表明,常规方法不区分大小写,并且查找包含给定标记的标记作为字符串,例如Find(“He”)将返回标记为“hello”True的ILNode。您可以考虑使用“代码>谓词< /代码>参数和匿名函数作为备选方案。谢谢。这似乎正是我遗漏的代码部分。我们使用“GetElementByTag”,因为一些测试表明,常规方法不区分大小写,并且查找包含给定标记的标记作为字符串,例如Find(“He”)将返回标记为“hello”True的ILNode。您可以考虑使用“代码>谓词< /代码>参数和匿名函数作为替代。