如何从 dm-script 中的长字符串数据中获取图像

问题描述

我想从字符串数据数组中获取图像数据。 下面的脚本运行良好,但速度低。 (字符串数据的实际长度比下面的例子长得多。) 我猜 for 循环中的像素寻址需要一些时间。

image str2img(string str)
{
    image img:=RealImage("",4,10,1)
    string tempstr=str
    for(number i=0;i<10;i++)
    {
        if(find(tempstr,",")!=-1)
        {
            img[i,0]=tempstr.left(find(tempstr,")).val()
            tempstr=tempstr.right(tempstr.len()-find(tempstr,")-1)
            result(tempstr+"\n")
        }else
        {
            img[i,0]=tempstr.val()
        }
    }
    return img
}

string input="1,2,3,5,6,7,8,9,10"
image output=str2img(input)
output.showimage()

然后我写了下面的脚本来使用流。 但是我收到了错误消息“遇到非数字文本”。

image str2img(string str)
{
    TagGroup Tg=NewTagGroup()
    Tg.TagGroupSetTagAsstring("data",str)
    
    object fstream=NewStreamFromBuffer(0)
    TagGroupWriteTagDataToStream(Tg,"data",fstream,0)
    fstream.StreamSetPos(0,0)

    number bLinesAreRows=1
    number bSizeByCount=1 
    number dtype=2 //2 for real4 (float)
    object imgSizeObj = Alloc( "ImageData_ImageDataSize" )
    image img := ImageImportTextData( "Imag Name ",dtype,imgSizeObj,bLinesAreRows,bSizeByCount )
    return img
}

string input="1,10"
image output=str2img(input)
output.showimage()

“ImageImportTextData()”函数是否只对读取保存的文件有效?

或者有什么有效的方法可以从长字符串数据中获取图像?

解决方法

很好的问题,我喜欢他们的方式。 不,ImageImportTextData() 适用于任何流,您将在下面的示例中看到。 但是,如果您希望它计数,该命令需要通过换行符来完成文本行,并且字符串标签流似乎存在问题。我从不使用它,因为有专门的命令来传输文本。

因此,您的固定脚本如下所示:


image str2img(string str)
{
    object fstream=NewStreamFromBuffer(0)
    fStream.StreamWriteAsText(0,str)  // Write text to stream directly
    fstream.StreamSetPos(0,0)

    number bLinesAreRows=1
    number bSizeByCount=1 
    number dtype=2 //2 for real4 (float)
    object imgSizeObj = Alloc( "ImageData_ImageDataSize" )
    
    image img := ImageImportTextData( "Imag Name ",fstream,dtype,imgSizeObj,bLinesAreRows,bSizeByCount )
    return img
}

string input="1,2,3,4,5,6,7,8,9,10\n" // Note final line-break if you want to count.
image output=str2img(input)
output.showimage()