【问题标题】:DM Script to import a 2D image in text (CSV) format以文本 (CSV) 格式导入 2D 图像的 DM 脚本
【发布时间】:2026-02-12 03:50:01
【问题描述】:

使用内置的“导入数据...”功能,我们可以将格式正确的文本文件(如 CSV 和/或制表符分隔)作为图像导入。编写一个脚本来这样做是相当直接的。但是,我的脚本编写方法效率不高 - 这需要我循环遍历每个原始文件(使用“StreamReadTextLine”函数),因此需要一段时间才能导入 512x512 图像。

有没有更好的方法或“未记录的”脚本功能可以利用?

【问题讨论】:

    标签: import-from-csv dm-script


    【解决方案1】:

    DigitalMicrograph 通过File/Import Data... 菜单条目提供导入功能,这将为您提供以下对话框:

    此对话框引发的功能也可以通过脚本命令访问,使用命令

    BasicImage ImageImportTextData( String img_name, ScriptObject stream, Number data_type_enum, ScriptObject img_size, Boolean lines_are_rows, Boolean size_by_counting )

    与对话框一样,必须预先指定一些内容。

    图像的数据类型

    这是一个数字。您可以通过例如创建输出其数据类型的图像来找出哪个数字属于哪种图像数据类型:

    image img := Realimage( "", 4, 100 )
    Result("\n" + img.ImageGetDataType() )
    

    文件流对象

    该对象描述了数据的存储位置。 F1 帮助文档解释了如何从现有文件创建文件流,但本质上您需要指定文件的路径,然后打开文件进行读取(它为您提供句柄),然后使用 fileHandle创建流对象。

    string path = "C:\\test.txt"
    number fRef = OpenFileForReading( path )
    object fStream = NewStreamFromFileReference( fRef, 1 )
    

    图像尺寸对象

    这是您需要分配的特定脚本对象。它包装图像大小信息。如果从文本中自动检测大小,则无需指定实际大小,但仍需要对象。

    object imgSizeObj = Alloc("ImageData_ImageDataSize")
    imgSizeObj.SetNumDimensions(2)      // Not needed for counting!
    imgSizeObj.SetDimensionSize(0,10)   // Not used for counting
    imgSizeObj.SetDimensionSize(1,10)   // Not used for counting
    

    布尔检查

    与 UI 中的复选框一样,您需要指定两个条件:

    • 行就是行
    • 通过计数获取大小

    注意,只有当“Lines are Rows”也为真时才使用“counting”标志。与对话框相同。


    以下脚本使用计算导入文本文件:

    image ImportTextByCounting( string path, number DataType )
    {
    
        number fRef     = OpenFileForReading( path )
        object fStream  = NewStreamFromFileReference( fRef, 1 )
        number bLinesAreRows    = 1
        number bSizeByCount     = 1 
        bSizeByCount *= bLinesAreRows // Only valid together!
    
        object imgSizeObj = Alloc("ImageData_ImageDataSize")
    
        image img := ImageImportTextData( "Imag Name ", fStream, DataType, imgSizeObj, bLinesAreRows, bSizeByCount )
        return img
    }
    
    string path = "C:\\test.txt"
    number kREAL4_DATA      = 2
    image img := ImportTextByCounting( path, kREAL4_DATA )
    img.ShowImage()
    

    【讨论】:

    • 作为备注:对话框的“二进制”导入部分也可以通过脚本命令访问,但与 F1 中描述的二进制流相比,这里几乎没有速度改进帮助文档。所以我没有在这里描述这个 - 它也没有被要求。 text 导入的速度提升当然是因为不需要(脚本)for 循环。