Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image ILNumerics:将场景的一部分导出为图像,而不影响原始场景_Image_Export_Scene_Ilnumerics - Fatal编程技术网

Image 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) {

我用ILNumerics创建了一个场景,它由3个PlotCube和一个颜色条组成

我想添加一个方法,以两种方式将场景导出为图像,第一种是上面看到的屏幕截图。 第二个导出应该只显示以中心为中心的多维数据集

我试图遵循ILNumerics的指导原则

我编写了以下代码:

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。您可以考虑使用“代码>谓词< /代码>参数和匿名函数作为替代。