如何使用 StreamWriteAsText() 写入 Number 类型的数据?
How can I use the StreamWriteAsText() to write data of the Number type?
我的最终目标是多次写入图像数据和拍摄时间的文件。这可用于生成时间与强度图。
为此,我尝试使用 ImageWriteImageDataToStream()
函数及时将一维图像重复写入文件流。我通过将一个 Listener 对象附加到我正在读出的相机视图来解决这个问题,并且这个 listener 执行一个函数,该函数在每次数据更改时使用 ImageWriteImageDataToStream()
(messagemap = "data_changed:MyFunctiontoExecute"
) 将图像写入文件流。
我的问题是,有没有办法将时间戳也写入同一个文件流?
我能找到的只有 StreamWriteAsText(),它采用 String 数据类型。时间是Number类型可以转换成String类型吗?
有没有人有更好的方法来做到这一点?
我目前的解决方案是同时创建一个单独的文件并使用 WriteFile() 记录时间,所以不使用文件流。
//MyFunctiontoExecute, where Img is the 1D image at the current time
My_file_stream.StreamSetPos(2,0)
ImageWriteImageDataToStream(Img, My_file_stream, 0)
//Write the time to the same file
Number tmp_time = GetHighResTickCount() - start_time
My_file_stream.StreamSetPos(2,0)
My_file_stream.StreamWriteAsText(0,tmp_time) //does not work
//instead using a different file
WriteFile(My_extrafileID,tmp_time+"/n")
我认为你的流媒体概念是错误的。当您流式传输到文件时,在 toStream()
命令的末尾,stream-position 已经在末尾 。所以你不设置位置。
您的脚本本质上是告诉计算机将流 返回 设置到该起始位置,然后写入文本 - 覆盖数据。
只有当你想在阅读过程中跳过某些部分时才需要'StreamSetPos()'命令(例如,在为特定文件格式定义import-scripts时很有用。或者只提取特定的sub-sets 来自文件。).
如果您只想"stream-out some raw-data",您就可以做到:只需依次调用命令即可:
void WriteDataPlusDateToStream( object fStream, image img, string dateStr )
{
number endian = 0
number encoding = 0
img.ImageWriteImageDataToStream(fStream,endian)
fStream.StreamWriteAsText(encoding,dateStr)
}
同样,您只需遵循相同的顺序 "stream-in":
void ReadDataPlusDateFromStream( object fStream, image img, string &dateStr )
{
number endian = 0
number encoding = 0
img.ImageReadImageDataFromStream(fStream,endian)
fStream.StreamReadTextLine(encoding,dateStr)
}
这里有两点很重要:
在ImageReadImageDataFromStream
中是图像img
的大小和data-type定义了多少字节从流中读取以及它们是如何被解释的。因此 img
一定是 pre-created 并且大小合适 file-type。
in StreamReadTextLine
流将继续读入 作为文本,直到遇到 end-of-line 字符 (\n
) 或流的结尾。因此确保在 streaming-out 时 写 这个 end-of-line 字符。或者,您可以确保字符串始终具有特定大小,然后使用具有指定适当长度的 StreamReadAsText
。
使用以上两种方法,您可以使用以下test-script作为起点:
void WriteDataPlusDateToStream( object fStream, image img, string dateStr )
{
number endian = 0
number encoding = 0
img.ImageWriteImageDataToStream(fStream,endian)
fStream.StreamWriteAsText(encoding,dateStr)
}
void ReadDataPlusDateFromStream( object fStream, image img, string &dateStr )
{
number endian = 0
number encoding = 0
img.ImageReadImageDataFromStream(fStream,endian)
fStream.StreamReadTextLine(encoding,dateStr)
}
void writeTest(string path)
{
Result("\n Writing to :" + path )
image testImg := RealImage("Test",4,100)
string dateStr;
number loop = 5;
number doAutoClose = 1
object fStream = NewStreamFromFileReference( CreateFileForWriting(path), doAutoClose )
for( number i=0; i<loop; i++ )
{
testImg = icol * random()
dateStr = GetDate(1)+"@"+GetTime(1)+"|"+Format(GetHighResTickCount(),"%.f") + "\n"
fStream.WriteDataPlusDateToStream(testImg,dateStr)
sleep(0.33)
}
}
void readTest(string path)
{
Result("\n Reading form :" + path )
image testImg := RealImage("Test",4,100)
string dateStr;
number doAutoClose = 1
object fStream = NewStreamFromFileReference( OpenFileForReading(path), doAutoClose )
while ( fStream.StreamGetPos() < fStream.StreamGetSize() )
{
fStream.ReadDataPlusDateFromStream(testImg,dateStr)
result("\n time:"+dateStr)
testImg.ImageClone().ShowImage()
}
}
string path = "C:/test.dat"
ClearResults()
writeTest(path)
readTest(path)
请注意,当像这样流式传输 "binary data" 时,是 你 定义了 file-format。您必须确保写入和读取代码匹配。
我的最终目标是多次写入图像数据和拍摄时间的文件。这可用于生成时间与强度图。
为此,我尝试使用 ImageWriteImageDataToStream()
函数及时将一维图像重复写入文件流。我通过将一个 Listener 对象附加到我正在读出的相机视图来解决这个问题,并且这个 listener 执行一个函数,该函数在每次数据更改时使用 ImageWriteImageDataToStream()
(messagemap = "data_changed:MyFunctiontoExecute"
) 将图像写入文件流。
我的问题是,有没有办法将时间戳也写入同一个文件流?
我能找到的只有 StreamWriteAsText(),它采用 String 数据类型。时间是Number类型可以转换成String类型吗?
有没有人有更好的方法来做到这一点?
我目前的解决方案是同时创建一个单独的文件并使用 WriteFile() 记录时间,所以不使用文件流。
//MyFunctiontoExecute, where Img is the 1D image at the current time
My_file_stream.StreamSetPos(2,0)
ImageWriteImageDataToStream(Img, My_file_stream, 0)
//Write the time to the same file
Number tmp_time = GetHighResTickCount() - start_time
My_file_stream.StreamSetPos(2,0)
My_file_stream.StreamWriteAsText(0,tmp_time) //does not work
//instead using a different file
WriteFile(My_extrafileID,tmp_time+"/n")
我认为你的流媒体概念是错误的。当您流式传输到文件时,在 toStream()
命令的末尾,stream-position 已经在末尾 。所以你不设置位置。
您的脚本本质上是告诉计算机将流 返回 设置到该起始位置,然后写入文本 - 覆盖数据。
只有当你想在阅读过程中跳过某些部分时才需要'StreamSetPos()'命令(例如,在为特定文件格式定义import-scripts时很有用。或者只提取特定的sub-sets 来自文件。).
如果您只想"stream-out some raw-data",您就可以做到:只需依次调用命令即可:
void WriteDataPlusDateToStream( object fStream, image img, string dateStr )
{
number endian = 0
number encoding = 0
img.ImageWriteImageDataToStream(fStream,endian)
fStream.StreamWriteAsText(encoding,dateStr)
}
同样,您只需遵循相同的顺序 "stream-in":
void ReadDataPlusDateFromStream( object fStream, image img, string &dateStr )
{
number endian = 0
number encoding = 0
img.ImageReadImageDataFromStream(fStream,endian)
fStream.StreamReadTextLine(encoding,dateStr)
}
这里有两点很重要:
在
ImageReadImageDataFromStream
中是图像img
的大小和data-type定义了多少字节从流中读取以及它们是如何被解释的。因此img
一定是 pre-created 并且大小合适 file-type。in
StreamReadTextLine
流将继续读入 作为文本,直到遇到 end-of-line 字符 (\n
) 或流的结尾。因此确保在 streaming-out 时 写 这个 end-of-line 字符。或者,您可以确保字符串始终具有特定大小,然后使用具有指定适当长度的StreamReadAsText
。
使用以上两种方法,您可以使用以下test-script作为起点:
void WriteDataPlusDateToStream( object fStream, image img, string dateStr )
{
number endian = 0
number encoding = 0
img.ImageWriteImageDataToStream(fStream,endian)
fStream.StreamWriteAsText(encoding,dateStr)
}
void ReadDataPlusDateFromStream( object fStream, image img, string &dateStr )
{
number endian = 0
number encoding = 0
img.ImageReadImageDataFromStream(fStream,endian)
fStream.StreamReadTextLine(encoding,dateStr)
}
void writeTest(string path)
{
Result("\n Writing to :" + path )
image testImg := RealImage("Test",4,100)
string dateStr;
number loop = 5;
number doAutoClose = 1
object fStream = NewStreamFromFileReference( CreateFileForWriting(path), doAutoClose )
for( number i=0; i<loop; i++ )
{
testImg = icol * random()
dateStr = GetDate(1)+"@"+GetTime(1)+"|"+Format(GetHighResTickCount(),"%.f") + "\n"
fStream.WriteDataPlusDateToStream(testImg,dateStr)
sleep(0.33)
}
}
void readTest(string path)
{
Result("\n Reading form :" + path )
image testImg := RealImage("Test",4,100)
string dateStr;
number doAutoClose = 1
object fStream = NewStreamFromFileReference( OpenFileForReading(path), doAutoClose )
while ( fStream.StreamGetPos() < fStream.StreamGetSize() )
{
fStream.ReadDataPlusDateFromStream(testImg,dateStr)
result("\n time:"+dateStr)
testImg.ImageClone().ShowImage()
}
}
string path = "C:/test.dat"
ClearResults()
writeTest(path)
readTest(path)
请注意,当像这样流式传输 "binary data" 时,是 你 定义了 file-format。您必须确保写入和读取代码匹配。