Я хочу сделать копию переднего изображения, которое содержит несколько срезов, например: изображение с несколькими кусочками Я использовал функцию imageclone

image front, img
front.getfrontimage()
img=imageclone(front)
img.showimage()

Но это только копирование первых кусочков. Кто-нибудь знает, как сделать копию этого вида изображения> "<Большое спасибо ~

1
Renfong 25 Апр 2017 в 08:54

2 ответа

Лучший ответ

Самый простой способ дублировать изображение (независимо от того, как оно отображается) - через его «контейнер» - ImageDocument. Вот коды:

ImageDocument imgDoc = GetFrontImageDocument();
number DoDeepCopy = 1;
ImageDocument newDoc = imgDoc.ImageDocumentClone(DoDeepCopy);
newDoc.ImageDocumentShow();

Если вам нужно манипулировать отдельными срезами, это более сложно. Надеюсь это поможет.

2
KEVIVI 26 Апр 2017 в 14:24

В дополнение к принятому (правильному и лучшему) ответу стоит знать, как перейти от «изображения» к его imageDocument. Вы делаете это, как в этом примере:

ClearResults()

image frontImg := GetFrontImage()
imageDocument frontDoc = GetFrontImageDocument()
Result( "Grapped from application:" )
Result( "\n\t Image: " + frontImg.ImageGetLabel() + "\t ID = " + frontImg.ImageGetID() )
Result( "\n\t Doc  : " + frontDoc.ImageDocumentGetName() + "\t ID = " + frontDoc.ImageDocumentGetID() )

imageDocument docFromImg = frontImg.ImageGetOrCreateImageDocument()
Result( "\n Taken from image:" )
Result( "\n\t Doc  : " + frontDoc.ImageDocumentGetName() + "\t ID = " + docFromImg.ImageDocumentGetID() )

image imgFromDoc := frontDoc.ImageDocumentGetImage( 0 )
Result( "\n Taken from imageDocument:" )
Result( "\n\t Image: " + frontImg.ImageGetLabel() + "\t ID = " + imgFromDoc.ImageGetID() )

Обратите внимание, что изображение не обязательно имеет imageDocument. ImageDocument создается только тогда, когда изображение отображается или сохраняется. Вот почему команда называется ...GetOrCreate.

Аналогично, imageDocument может содержать несколько изображений (или ни одного).

Это все немного запутанно, и это выглядит сбивающим с толку, потому что многие «правильные» команды, следующие внутренней иерархии классов, обернуты командами упрощения для удобства написания сценариев.

F.E. Для сохранения изображения с помощью SaveSave() требуется переменная image, но для этого действительно необходимо сохранить imageDocument. Так что он неявно получает / создает один. В противном случае пользователю потребуется написать правильный, но более сложный сценарий.
Вместо:

string path = "C:\\test.dm4"
image img := GetFrontImage()
img.SaveImage( path )

Нужно было бы:

string path = "C:\\test.dm4"
string handler = "Gatan Format"
image img := GetFrontImage()
imageDocument doc = img.ImageGetOrCreateImageDocument()
doc.ImageDocumentSaveToFile( handler, path )

Также обратите внимание: хотя путь использования imageDocuments - правильный путь, вы должны знать, что «отображение линейного графика» действительно особенное. Это объекты imageDisplay, которые могут содержать более одного изображения, тогда как imageDocuments - это объекты, которые могут содержать более одного imageDisplay. Я подчеркиваю это, чтобы вы знали, что вам нужно добавить новые изображения в imageDisplay, чтобы получить больше фрагментов в изображении фрагмента. Если вы добавите их в imageDocument, вы получите несколько отображений linePlot в одном файле.

В зависимости от того, насколько «глубоко» вам нужно все это знать, я бы рекомендовал прочитать раздел документации по «image / imageDocument / imageDisplay / components» и немного протестировать его. Если вопросы остались, опубликуйте их здесь, на StackOverflow: c)

1
BmyGuest 28 Апр 2017 в 07:53
43602683