Как скопировать фрагменты изображения?

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

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

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


person Renfong    schedule 25.04.2017    source источник


Ответы (2)


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

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

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

person KEVIVI    schedule 26.04.2017
comment
Большое спасибо. Теперь я знаю, что при добавлении фрагментов в изображение следует обращаться с изображением как с изображением документа. - person Renfong; 28.04.2017
comment
@Renfong: я не знаю, какую версию GMS вы используете (всегда полезно указать это в вопросе), но в последних установках GMS есть довольно много примеров сценариев для линейных графиков в разделе справки F1 Сценарии / Примеры сценариев. /Отображение данных относительно изображений типа linePlot. - person BmyGuest; 28.04.2017
comment
@BmyGuest, я использую GMS 3.20. Большое спасибо ^^ Я буду помнить это в следующий раз. - person Renfong; 28.04.2017

В дополнение к принятому (правильному и лучшему) ответу стоит знать, как перейти от «изображения» к его 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 может содержать несколько изображений (или ни одного).

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

например Сохранение изображения с помощью 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 является правильным, вы должны знать, что «дисплеи linePlot» действительно особенные. Это объекты imageDisplay, которые могут содержать более одного изображения, тогда как imageDocuments — это объекты, которые могут содержать более одного imageDisplay. Я указываю на это, чтобы вы знали, что вам нужно добавить новые изображения в imageDisplay, чтобы получить больше фрагментов в изображении фрагмента. Если вы добавите их в imageDocument, вы получите несколько отображений linePlot в одном файле.

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

person BmyGuest    schedule 28.04.2017