如何在不显示图像的情况下向图像添加注释,尤其是比例尺?
我有一个记录图像的应用程序。我想向每个重新绘制的图像添加一个比例尺。但是用户可以选择不显示记录的图像。这就是为什么我要在显示图像之前且与显示图像无关地添加比例尺。
该文档建议ImageDocumentSaveToFile()
用于保存。因此,我正在为图像创建图像文档。由于比例尺已添加到图像显示中,因此我还添加了图像显示(如果未提供显示)。但是,当我保存图像文档并再次加载它时,出现以下错误:
这说明我在某处将图像两次添加到图像文档中。但是我不知道在哪里(代码在下面发布)。
我可以从保存路径手动打开图像。该图像显示了内容(此处为纯色),但未显示比例尺(上面显示的屏幕截图)。因此,我想我会以某种方式添加两个显示或图像,其中一个包含比例尺,而另一个不包含比例尺。但是我不知道现在该如何进行以及如何解决这个问题。
我的精简代码发布在下面。
所以我的问题是:在我的代码中什么导致比例尺不显示,以及什么导致GMS在打开图像时引发错误?甚至更好的是,在不显示图像的情况下向图像添加注释的最佳实践是什么?
number image_width = 128;
number image_height = 128;
image img := RealImage("Image", 4, image_width, image_height);
img = 128;
ImageDocument doc = img.ImageGetOrCreateImageDocument();
void addScalebar(ImageDisplay display){
number top = image_height - image_height / 5;
number bottom = image_height;
number left = 0;
number right = image_width / 3;
Component scalebar = NewComponent(31, top, left, bottom, right);
scalebar.ComponentSetForegroundColor(0, 255, 0);
display.ComponentAddChildAtBeginning(scalebar);
}
image tmp_img;
for(number i = 0; i < doc.ImageDocumentCountImages(); i++){
tmp_img = doc.ImageDocumentGetImage(i);
if(tmp_img.ImageCountImageDisplays() > 0){
for(number j = 0; j < tmp_img.ImageCountImageDisplays(); j++){
addScalebar(tmp_img.ImageGetImageDisplay(j));
}
}
else{
ImageDisplay disp = doc.ImageDocumentAddImageDisplay(tmp_img, -2);
addScalebar(disp);
}
}
string save_format = "Gatan Format";
string path = PathConcatenate(GetApplicationDirectory("temporary", 1), "demo-image");
doc.ImageDocumentSaveToFile(save_format, path);
string open_path;
ImageDocumentAdjustFileNameForSaveFormat(save_format, path, open_path);
result("Demo image is located at '" + open_path + "'\n");
image display_image := OpenImage(open_path);
display_image.ShowImage();
发布的代码以编写dm-script
。我的原始代码是用python编写的,这是一种不太直接的翻译,dm-script
对于dm-script可能更容易理解。另外,我觉得在张贴问题变得“更笼统” dm-script
。该问题适用于两种编程语言,我希望该解决方案也能实现。如果不是,并且您知道python的实现,我也很高兴看到它。
非常好的脚本。您陷入了典型的DM初学者的陷阱,不幸的是,脚本语言具有非常不标准的语法。
之间有一个区别:
tmp_img = doc.ImageDocumentGetImage(i);
和:
tmp_img := doc.ImageDocumentGetImage(i);
第二个示例是您要执行的操作:将图像变量tmp_img
指向imageDocument的第i个图像。
但是,第一个示例将第i个图像的数据值复制到新创建的图像中。这个新创建的图像没有imageDisplay!这就是为什么您的代码示例会分支到“ else”语句中的原因。
另请注意,如果您事先修复了该行,则不需要if / else。ImageDocuments无法保存图像,它们包含imageDisplays(与图像相关联)。更具体地说:ImageDocuments具有一个根组件,该根组件与所有组件一样可以具有子组件。ImageDisplays也是组件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句