2016-09-10 4 views
0

In meinem GUIDE generierte GUI habe ich ein Achsenobjekt, in das ich eine Bitmap imshow() wenn die GUI initialisiert. Ich habe ein WindowButtonMotion Rückruf wie folgt definiert:Matlab WindowButtonMotion Callback funktioniert nicht mehr, wenn das Bild geändert wird

function theGui_WindowButtonMotionFcn(hObject, eventdata, handles) 
    % handles.mode_manager is initialized in the gui startup code 
    if (isempty(handles.mode_manager.CurrentMode)) 
    obj_han=overobj('axes'); 
    if ~isempty(obj_han) 
     set(handles.theGui, 'Pointer','cross'); 
    else 
     set(handles.theGui, 'Pointer','arrow'); 
    end 
    end 
end 

habe ich einen Rückruf auf die geöffnete Datei in der Symbolleiste auf das dies tut:

function openFile_ClickedCallback(hObject, eventdata, handles) 
    % handles.image_handle received the handle from the imshow that 
    % opened the initial image 
    tmp_handle = handles.image_handle; 
    [name, path] = uigetfile({'*.bmp'; '*.jpg'}); 
    if (path == 0) 
    return 
    else 
    filename = strcat(path, name); 
    end 

    % read the image into the axes panel 
    hold on 
    handles.image_handle = imshow(filename); 
    set(handles.image_handle, 'ButtonDownFcn', @imageMouseDown); 
    handles.mode_manager = uigetmodemanager(); 
    delete(tmp_handle); 
    guidata(hObject, handles); 
end 

Nachdem das neue Bild in den Achsen Objekt der angezeigt wird gui, der Zeiger ändert sich nicht mehr in ein Kreuz über dem Achsenobjekt. Das Problem hat etwas mit dem neu angezeigten Bild zu tun, denn wenn ich den Teil des Codes, der das neue Bild tatsächlich anzeigt, auskommentiere, erscheint der Zeiger nach dem Aufruf des OpenFile-Callbacks als Kreuz.

Antwort

1

Der Callback funktioniert nicht mehr, da imshow das Achsenobjekt ersetzt.

Der folgende Code demonstriert das Problem:

imshow(zeros(100)); 
h = gca; 
h.UserData = 123; %Set UserData property value to 123 
imshow(ones(100)); %Use imshow again. 
h2 = gca; 

Jetzt:

h2.UserData 

ans = 

    [] 

h.UserData 
Invalid or deleted object. 

Wie Sie sehen können, wieder mit imshow die Achsen Objekt ersetzt, mit neuen Achsen-Objekt.


Das folgende Beispiel ändert nur die Bilddaten, ohne die Achsen zu ändern:

image_handle = imshow(zeros(100)); 
h = gca; 
h.UserData = 123; %Set UserData property value to 123 
%imshow(ones(100), 'Parent', h); %Use imshow again. 
image_handle.CData = ones(100); %Modify only image data, without modifying the axes. 
h2 = gca; 

Jetzt:

h2.UserData 

ans = 

    123 

Ändern Sie bitte Ihre handles.image_handle = imshow(filename); Code:

I = imread(filename); 
handles.image_handle.CData = I; 
+0

Danke, das funktioniert. Aber ich verstehe immer noch nicht warum. Der WindowButtonMotion-Callback sucht, ob der Zeiger über einem * Achsenobjekt liegt, nicht an einem bestimmten. Auch wenn das Objekt ersetzt wurde, befindet sich der Zeiger immer noch über einem Achsenobjekt. Eine Folge - wie würde ich das Originalbild in ein Achsenobjekt lesen, das in GUIDE erstellt wurde? Da der Code derzeit geschrieben wird, wird das ursprüngliche Achsenobjekt durch das ursprüngliche imshow ersetzt. (Und trotzdem funktioniert der Aufruf von WindowButtonMotion am Anfang.) – Llaves

+0

Ich verstehe nicht wirklich, warum WindowButtonMotion beim Ersetzen der Achsen nicht mehr funktioniert ... Das Originalbild in ein Achsenobjekt lesen: Ich habe es im Kommentar hinterlassen: ' imshow (Einsen (100), 'Eltern', h); '(h ist eine Achse, und Einsen (100) ist die Bildmatrix). – Rotem

+0

Ich versuchte 'imshow (Dateiname, 'Parent', Achsen_Handle)' beim Öffnen des Originalbildes, wobei axes_handle das Handle GUIDE erzeugt. Das Achsenobjekt wird noch ersetzt. Aber das ist mehr eine Verblüffung als ein Problem. Vielen Dank – Llaves

Verwandte Themen