Этот ответ просто для публикации альтернативной стратегии, упомянутой в комментариях, к ответу с оригинальным примером сценария. Обратите внимание, что следующая измененная версия НЕ РАБОТАЕТ, поскольку попытка зарегистрировать прослушиватель с изменением изображения кажется неудачной (объект слушателя немедленно освобождается).
class CFrameCompleteListen2
{
number lastPixelValue
number listenID
number frameCount
void OnDataChanged( object self, number flags, image img )
{
Result("\n Change event." )
number value = img.GetPixel( 0, 0 )
if ( value == lastPixelValue )
return
frameCount++
lastPixelValue = value
Result( "\n Image [" + img.GetLabel() + "] frame #"+ frameCount + " complete." )
if ( 3 <= frameCount )
{
ImageRemoveEventListener( img, listenID )
Result("\n Listening stopped." )
}
}
object Launch( object self, image img )
{
lastPixelValue = img.GetPixel( 0, 0 )
frameCount = 0
listenID = ImageAddEventListener( img, self, "data_changed:OnDataChanged" )
Result("\n Listening started." )
return self
}
~CFrameCompleteListen2( object self )
{
Result( "\n Listener released.\n" )
}
}
void main()
{
image targetImage := GetFrontImage()
number targetW = targetImage.ImageGetDimensionSize(0)
number targetH = targetImage.ImageGetDimensionSize(1)
image lastPixelImage := targetImage[targetH - 1, targetW - 1, targetH, targetW]
lastPixelImage.ShowImage()
object listener = Alloc( CFrameCompleteListen2 ).Launch( lastPixelImage )
}
main()
Редактировать: от BmyGuest (см. Комментарии):
Следующий скрипт показывает, что при отображении «нарезанной» памяти создается новое изображение с новой ссылкой:
ClearResults()
image newFull := RealImage("Full",4,100,100)
Result("\n Image label 'full':" + newFull.ImageGetLabel() + " | ID:" + newFull.ImageGetID())
newFull.ShowImage()
Result("\n Image label 'full':" + newFull.ImageGetLabel() + " | ID:" + newFull.ImageGetID())
image getFull := GetFrontImage()
Result("\n Image label 'full' (front):" + getFull.ImageGetLabel() + " | ID:" + getFull.ImageGetID())
image slice := newFull[0,0,2,2]
Result("\n Image label 'slice':" + slice.ImageGetLabel() + " | ID:" + newFull.ImageGetID())
slice.ShowImage()
Result("\n Image label 'slice':" + slice.ImageGetLabel() + " | ID:" + newFull.ImageGetID())
image getSlice := GetFrontImage()
Result("\n Image label 'slice' (front):" + getSlice.ImageGetLabel() + " | ID:" + getSlice.ImageGetID())
Вывод этого скрипта выглядит примерно так:
![enter image description here](https://i.stack.imgur.com/lwHYf.png)
Следовательно, вышеприведенный скрипт слушателя завершается сбоем и отменяет регистрацию слушателя, потому что lastPixelImage не ссылается на показанное 1-пиксельное изображение и, следовательно, немедленно выходит из области действия (удаляя слушателя в процессе). Сценарий работает , если после его показа взять изображение и использовать его в качестве справочного. Соответственно, скрипт также будет работать, если переменная нарезанного изображения будет находиться в области видимости.