Matlab ButtonDownFcn не работает с изображением

Я пытаюсь увеличить области набора Мандельброта, нажав кнопку. Я использую GUIDE и поэтому хочу использовать ButtonDownFcn осей. Я храню изображение в массиве с именем imag, который содержит x и y координаты и цвет.

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

axes(handles.DrawAxes);
cla

imagesc(imag,'HitTest','Off');

person Michael Hutton    schedule 09.04.2016    source источник


Ответы (1)


Как описано здесь, высокоуровневые функции построения графиков фактически очищают свойства осей при вызове. Таким образом, вы либо используете функцию hold (которая влияет на свойство NextPlot), либо просто устанавливаете обратный вызов осей ButtonDownFcn после вызова image/imagesc/imshow.

Вот пример:

% create axes
ax = axes();

% display image
img = imread('cameraman.tif');
imagesc(img, 'Parent',ax, 'PickableParts','none', 'HitTest','off');
axis(ax, 'image')
colormap gray

% set click callback
ax.ButtonDownFcn = @(o,e) disp('axis clicked');

Позже, если вам нужно обновить изображение, используйте дескриптор изображения для обновления свойства CData вместо повторного построения изображения.

person Amro    schedule 09.04.2016
comment
Примечание: приведенный выше пример был написан для графической системы HG2, представленной в R2014b. Должно быть легко изменить его для более старых выпусков. - person Amro; 09.04.2016
comment
Итак, теперь я могу заставить buttondownfnc работать, используя следующее: axes_handle = handles.DrawAxes; imagesc(imag,'HitTest','Off'); set(axes_handle, 'ButtonDownFcn', {@FcnName,a,b}); однако я не уверен, как щелкнуть позицию или получить доступ к дескрипторам для моего графического интерфейса. - person Michael Hutton; 09.04.2016
comment
это отдельные вопросы, вы должны создать новый вопрос и спросить об этой части.. Но для начала есть свойство CurrentPoint, используемое для получения положения мыши. Что касается дескрипторов, вы можете либо использовать findobj, либо сохранить дескрипторы в пользовательском интерфейсе, используя guidata или getappdata. - person Amro; 09.04.2016