Ладно, давайте разберёмся - там сложного на самом деле ничего нет.
IvanLis писал(а):
Чудеса....
За постулат примем то, что чудес на свете не бывает - в компьютере только биты да байты плюс нехитрые операции, он делает ровно то, о чём его просят.
IvanLis писал(а):
Так как обратного преобразования, я решил использовать обычное преобразование String->Image. И самое удивительное, что заработало.
Удивительного ничего нет - пара IMAQ Flatten / Unflatten совместима между собой. А то, что я выше писал про невозможность Unflatten для JPEG потока относится только к случаю, когда мы имеем чистый JPEG (например полученный при помощи IMAQ Write String, либо при непосредственном чтении JPEG файла). В данном случае строка помимо JPEG данных уже содержит необходимый IMAQ заголовок, так что плясок с бубном не требуется.
Заметьте также, что для Unflatten требуется только константа - IMAQ Create вызывать не нужно, тип, имя, размер - всё это не требуется, так как эта информация уже содержится во входной строке.
Вот типичные грабли, на которые наступают, когда используют эту пару:
На первый взгляд кажется, что интенсивность на выходе IMAQ Histogram будет 100, однако она будет равна 50, поскольку в третьем фрейме Unflatten перезаписывает картинку с именем Untitled (мы хорошо помним, что картинки передаются по ссылке). Возможных выходов тут два - либо делать копию перед вызовом IMAQ Flatten либо поставить флаг Flatten with Process-Unique Name (этот флаг доступен только начиная с десятой версии Vision), тогда Unflatten создаст новую картинку с именем типа "remote image 0000000005625484 @ 00-FF-FF-FD-55-8E pid 000016B8" Всё это нужно только в том случае, когда Flatten / Unflatten используются в одном контексте. Если они разнесены в разные процессы, обменивающиеся строкой данных, то имена роли естественно не играют.
IvanLis писал(а):
Попробовал сохранить кадр Image -> Jpeg String в текстовый файл. Вроде открывается, но уже с искажениями.
Искажения могут быть связаны только с JPEG компрессией - она портит качество изображения. Степень потерь зависит от степени компрессии, разумеется. В свете того, что выше двоичные данные сохранялись как текстовые строки, можно получить искажения совсем другого рода, но они будут связаны с тем, что данные просто порушены.
IvanLis писал(а):
При работе по сети. Видно, что кадр принимается нормально. Преобразование Jpeg String -> Image производится без ошибок. Но при этом на индикаторе Image ничего не отображается
А вот тут может быть несколько причин. Прежде всего, надо, конечно быть уверенным, что принимающая сторона строку принимает без искажений.
Важно также, чтобы версии Vision совпадали на обоих компьютерах (поскольку совместимость картинки в виде Flattened String между различными версиями вообще говоря не гарантируется)
Бывали случаи, когда Vision Run-Time ставился криво и не добавлял необходимые файлы в Shared папку. Косвенные симптомы этого - отсутствующие инструменты (лупа, указатель, ROI) слева от Vision Display.
вообще говоря проще всего поставить LabVIEW на оба компьютера - резко облегчает отладку.
Вот ещё типичные грабли, на которые наступают при отображении постоянно меняющейся картинки:
Кажется, что интенсивность изображения будет 100 (разумеется я имею в виду интенсивность, показываемую в статусной строке Vision Display), однако она будет 50 (впрочем, воспроизводимость эффекта зависит от скорости компьютера).
Дело в том, что Vision Display не показывает картинку немедленно. Она обновляется в отдельном UI потоке. И в данном случае изображение начинает обновляться при следующей итерации While цикла (во время Wait функции). Ну а поскольку изображения передаются по ссылке, мы видим вовсе не то, что записали в Vision Display, а то, что в данный момент находится в картинке, ссылка на которую хранится в контроле. Самый простой способ - сделать буферизацию - перед записью в Vision Display сделать копию картинки (IMAQ Copy) и использовать для отображения копию. Теоретически этот случай может иметь место и Vision Display перехлёстывается с Unflatten. Можно также вызвать метод Refresh Image, что запустит немедленное обновление, но и в этом случае надо будет дать время на обновление. Но я бы порекомендовал использовать буфер - будет значительно лучше, если данные в окне Vision Display не будут меняться извне.
IvanLis писал(а):
А при передаче по сети (UDP протокол), строка не искажается?
По идее она как бинарные данные должна передаваться
Нет, конечно, не искажается. Данные могут не дойти, но исказиться не могут.
Самый наипростейший способ проконтроллировать целостность передаваемых данных - добавить циклическую контрольную сумму при передаче и проверять её при приёме.
IvanLis писал(а):
И еще вопрос, Вы пробовали открыть сжатый Jpeg файл.
Пробовал, но там данные порушены. Дело в том, что если в исходной строке уже была комбинация 0x0D 0x0A, то она остаётся неизменной в текстовом файле. При обратном чтении она заменяется на 0x0A - и данные рушатся.