如何在 dm 脚本中不显示图像的情况下添加比例尺
How to add a scalebar without displaying the image in dm-script
如何在不显示图像的情况下向图像添加注释,尤其是比例尺?
我有一个记录图像的应用程序。我想为每个重新记录的图像添加一个比例尺。但用户可以选择不显示录制的图像。这就是为什么我想在显示图像之前独立添加比例尺。
文档建议使用 ImageDocumentSaveToFile()
进行保存。因此,我正在为图像创建一个图像文档。由于将比例尺添加到图像显示中,因此我还添加了图像显示(如果没有给出显示)。但是当我保存图像文档并再次加载它时,出现以下错误:
这告诉我我在某处将图像两次添加到图像文档中。但我不知道在哪里(下面的代码 posted)。
我可以从图片保存路径手动打开图片。该图像显示了内容(此处为纯色)但未显示比例尺(如上所示的屏幕截图)。所以我想我以某种方式添加了两个显示或图像,其中一个包含比例尺,另一个不包含。但是我现在不知道怎么走,怎么解决这个问题。
我的精简代码如下 posted。
所以我的问题是:我的代码中是什么导致比例尺不显示以及是什么导致 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();
posted代码写在dm-script
。我的原始代码是用 python 编写的,这是对 dm-script
的更直接翻译,对于 dm-script 可能更容易理解。另外,我觉得 post dm-script
中的问题“更笼统”。该问题适用于两种编程语言,我希望解决方案也适用。如果没有,如果你知道 python 实现,我也很高兴看到它。
非常好的剧本。
您陷入了典型的 DM 初学者陷阱,不幸的是脚本语言的语法非常不标准。
There is a difference between:
tmp_img = doc.ImageDocumentGetImage(i);
and:
tmp_img := doc.ImageDocumentGetImage(i);
第二个示例是您要执行的操作:让图像变量 tmp_img
指向 imageDocument 的第 i 个图像。
但是,第一个示例将第 i 个图像的数据值 复制到新创建的图像中。这个新创建的图像没有 imageDisplay!这就是为什么您的代码示例分支到 'else' 语句的原因。
另请注意,如果您事先修复了线路,则不需要 if/else。 ImageDocuments 不能保存图像,它们保存 imageDisplays(与图像相关联)。
更具体地说:ImageDocuments 有一个根组件,像所有组件一样,它可以有子组件。 ImageDisplays 也是组件。
这是问题 Python 变体的答案。
以下可以做你想做的(在 Python 中):
import numpy as np
imgArray = np.arange(200000).reshape(400, 500).copy(order='C')
testImg = DM.CreateImage(imgArray)
doc = testImg.GetOrCreateImageDocument()
doc.GetRootComponent().GetNthChildOfType(20, 0).AddNewComponent(31, 10,10,40,400)
path = 'C:/temp/uniqueName3.dm4'
doc.SaveToFile('Gatan Format',path)
# Cleanup
del testImg
del doc
如何在不显示图像的情况下向图像添加注释,尤其是比例尺?
我有一个记录图像的应用程序。我想为每个重新记录的图像添加一个比例尺。但用户可以选择不显示录制的图像。这就是为什么我想在显示图像之前独立添加比例尺。
文档建议使用 ImageDocumentSaveToFile()
进行保存。因此,我正在为图像创建一个图像文档。由于将比例尺添加到图像显示中,因此我还添加了图像显示(如果没有给出显示)。但是当我保存图像文档并再次加载它时,出现以下错误:
这告诉我我在某处将图像两次添加到图像文档中。但我不知道在哪里(下面的代码 posted)。
我可以从图片保存路径手动打开图片。该图像显示了内容(此处为纯色)但未显示比例尺(如上所示的屏幕截图)。所以我想我以某种方式添加了两个显示或图像,其中一个包含比例尺,另一个不包含。但是我现在不知道怎么走,怎么解决这个问题。
我的精简代码如下 posted。
所以我的问题是:我的代码中是什么导致比例尺不显示以及是什么导致 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();
posted代码写在dm-script
。我的原始代码是用 python 编写的,这是对 dm-script
的更直接翻译,对于 dm-script 可能更容易理解。另外,我觉得 post dm-script
中的问题“更笼统”。该问题适用于两种编程语言,我希望解决方案也适用。如果没有,如果你知道 python 实现,我也很高兴看到它。
非常好的剧本。 您陷入了典型的 DM 初学者陷阱,不幸的是脚本语言的语法非常不标准。
There is a difference between:
tmp_img = doc.ImageDocumentGetImage(i);
and:
tmp_img := doc.ImageDocumentGetImage(i);
第二个示例是您要执行的操作:让图像变量 tmp_img
指向 imageDocument 的第 i 个图像。
但是,第一个示例将第 i 个图像的数据值 复制到新创建的图像中。这个新创建的图像没有 imageDisplay!这就是为什么您的代码示例分支到 'else' 语句的原因。
另请注意,如果您事先修复了线路,则不需要 if/else。 ImageDocuments 不能保存图像,它们保存 imageDisplays(与图像相关联)。 更具体地说:ImageDocuments 有一个根组件,像所有组件一样,它可以有子组件。 ImageDisplays 也是组件。
这是问题 Python 变体的答案。 以下可以做你想做的(在 Python 中):
import numpy as np
imgArray = np.arange(200000).reshape(400, 500).copy(order='C')
testImg = DM.CreateImage(imgArray)
doc = testImg.GetOrCreateImageDocument()
doc.GetRootComponent().GetNthChildOfType(20, 0).AddNewComponent(31, 10,10,40,400)
path = 'C:/temp/uniqueName3.dm4'
doc.SaveToFile('Gatan Format',path)
# Cleanup
del testImg
del doc