Как открыть изображение с аннотациями по сценарию - PullRequest
1 голос
/ 14 апреля 2020

Как открыть изображение (dm4) с аннотациями в скрипте в dm-script?


Когда изображение dm4 имеет аннотации (например, масштабную линейку или некоторый текст), это отображается когда я открываю изображение через меню (Ctrl + O). Но когда я открываю тот же файл в скрипте с помощью openImage(), они не отображаются, как показано ниже.

Слева находится изображение, открытое через меню, справа точно такое же изображение, открытое на openImage(). Аннотации отсутствуют.

Real image Image opened via script

В следующем примере показано то же самое. Код добавляет текст к изображению, сохраняет его и открывает снова. Открытое изображение не показывает аннотации так же, как изображения выше:

String path = GetApplicationDirectory("current", 0);
path = PathConcatenate(path, "temp.dm4");

// get the current image
image img;
img.getFrontImage();
ImageDisplay display = img.ImageGetImageDisplay(0);

// add some test annotations
number height = img.ImageGetDimensionSize(1);
number padding = height / 100;
number font_size = height/10;
for(number y = padding; y + font_size + padding < height; y += font_size + padding){
    Component annotation = NewTextAnnotation(padding, y, "Test", font_size);
    annotation.componentSetForegroundColor(255, 255, 255);
    display.ComponentAddChildAtEnd(annotation);
}

// save the current image
img.saveImage(path);

// show the saved image
image img2 = openImage(path);
img2.showImage();

1 Ответ

1 голос
/ 14 апреля 2020

У вас есть ошибка во второй-последней строке. Используя = вместо :=, вы копируете (только значения) из открытого изображения в новое изображение. Вы хотите сделать

image img2 := openImage(path)

Это довольно типичная ошибка, допущенная для новичка в написании сценариев, потому что это "особенность" языка сценариев, которого нет в других языках. Это происходит потому, что написание сценариев позволяет создавать очень простые сценарии, такие как Z = log(A), где новые изображения (здесь Z) создаются "на лету" после обработки существующих изображений (здесь A).

Так что необходимо другой оператор , когда требуется присвоить изображение переменной.

Для получения дополнительной информации см. Справочную документацию F1 здесь: enter image description here

Тот же лог c / источник ошибок касается использования := вместо = при «поиске» изображений, «создании новых изображений» и клонировании изображений (с метаданными). Обратите внимание на различия при попытке обоих:

image a := RealImage("Test",4,100,100)
ShowImage(a)

image b = RealImage("Test",4,100,100)
ShowImage(b)

и

image a := GetFrontImage()
a = 0

image b = GetFrontImage()
b = 0

и

image src := GetFrontImage()
image a := ImageClone( src )
showImage(a)

image b := ImageClone( src )
showImage(b)
...