如何使用dm脚本实现"save display as"功能?

How to use dm script to realize the "save display as" function?

使用菜单中的“显示另存为”功能可以很容易地将伪彩图保存为BMP或JPG格式。但是它无法将图像堆栈保存为具有显示颜色的分离图像。 “另存为”仅保存堆栈的正面图像。我无法点击数百次来保存整个堆栈!但是我在dm手册中没有找到对应的脚本函数。如何实现?

希望这就是您要找的。显示的脚本允许您将当前工作区中的所有图像保存到一个目录中。您可以指定格式、目录和名称模式。 (它比我预期的要长一点):

TagGroup formats = NewTagGroup();
formats.TagGroupSetTagAsString("Gatan Format", "dm4");
formats.TagGroupSetTagAsString("Gatan 3 Format", "dm3");
formats.TagGroupSetTagAsString("GIF Format", "gif");
formats.TagGroupSetTagAsString("BMP Format", "bmp");
formats.TagGroupSetTagAsString("JPEG/JFIF Format", "jpg");
formats.TagGroupSetTagAsString("Enhanced Metafile Format", "emf");
formats.TagGroupSetTagAsString("TIFF Format", "tif");
formats.TagGroupSetTagAsString("PCX Format", "pcx");

class FormatDialog : UIFrame{
    TagGroup format_select;
    number FormatDialogGetSelectedFormat(object self){
        if(format_select.TagGroupIsValid()){
            return format_select.DLGGetValue();
        }
        else{
            return -1;
        }
    }
    
    object init(object self){
        TagGroup dlg, dlg_items;
        
        dlg = DLGCreateDialog("Select the format", dlg_items);
        
        dlg_items.DLGAddElement(DLGCreateLabel("Please select the export format"));
        
        format_select = DLGCreateChoice(0);
        format_select.DLGIdentifier("format_select");
        for(number i = 0; i < formats.TagGroupCountTags(); i++){
            string text;
            formats.TagGroupGetIndexedTagAsString(i, text);
            text = formats.TagGroupGetTagLabel(i) + " (" + text + ")";
            format_select.DLGAddChoiceItemEntry(text);
        }
        dlg_items.DLGAddElement(format_select);
        
        self.super.init(dlg);
        return self;
    }
}

object format_dialog = alloc(FormatDialog).init();
if(format_dialog.pose()){
    number format = format_dialog.FormatDialogGetSelectedFormat();
    
    if(format < 0 || format >= formats.TagGroupCountTags()){
        throw("Invalid format is selected");
    }
    
    string save_format = formats.TagGroupGetTagLabel(format);
    string save_extension;
    formats.TagGroupGetIndexedTagAsString(format, save_extension);

    string save_dir;
    if(GetDirectoryDialog("Please select the path to save to", GetApplicationDirectory("open_save", 1), save_dir)){
        string save_name;
        if(GetString("Please set the file name (without extension). A number will be added to the end automatically.", "file_", save_name)){
            for(number i = 0; i < CountImageDocuments(); i++){
                ImageDocument doc = GetImageDocument(i);
                doc.ImageDocumentSaveToFile(save_format, PathConcatenate(save_dir, save_name + i + "." + save_extension));
            }
            OKDialog("Saved " + CountImageDocuments() + " files.");
        }
    }
}

请注意,您可以将其添加到 DigitalMicrograph 的菜单中。将发布的代码保存为文件,然后使用 File > Install Script File 并将脚本添加到任何现有菜单或新菜单。

您要查找的命令是 ImageDisplayGetExportImage() 实际上有一个 最新 GMS 的 F1 帮助文档中的示例脚本:


但是命令 - 与菜单项相同 - 只会作用于实际显示,因此您仍然需要使用脚本通过脚本遍历显示层 ImageDisplaySetDisplayedLayers()

因此您的脚本将类似于以下示例:

image test:=RealImage("Stack",4,100,100,10)
test=sin(icol/iwidth*Pi()*2) * cos(itheta*iplane) 
test.ShowImage()
imagedisplay disp = test.ImageGetImageDisplay(0)
disp.ImageDisplaySetColorTableByName("Rainbow")

number nz = test.ImageGetDimensionSize(2)
for( number z=0; z<nz; z++){
    disp.ImageDisplaySetDisplayedLayers(z,z)
    imageDisplay newdisp 
    image asDisplayedRGB := disp.ImageDisplayGetExportImage( 7, newdisp ) 
    asDisplayedRGB.SetName( test.GetName() + "_" + z )
    asDisplayedRGB.ShowImage()
}

EGUPerformActionWithAllShownImages("arrange")