2016-09-10 3 views
3

Mein Programm öffnet ein BildWie behalte ich Textobjekte in einem Matlab-Achsenfenster beim Öffnen eines neuen Bildes?

pic_handle = imshow('pic.bmp'); 

fügt dann Text

text(x, y, 'my text'); 
text(x2, y2, 'more text'); 

dann später auf den Benutzerobjekten ein anderes Bild auswählen zu öffnen, die

imshow('pic2.bmp'); 
delete(pic_handle); 

zu

führt Und jetzt All mein Text verschwindet. Nachdem ich ein wenig herumgestöbert habe, sehe ich, dass die Anzeigeliste gelöscht wurde und die Handles zu den Textobjekten scheinbar ungültig sind (nicht ganz sicher).

Meine Frage ist, ob es eine Möglichkeit gibt, den Text zu bewahren? dh ein neues Bild im Achsenobjekt öffnen, ohne die Anzeigeliste wegzublasen?

Antwort

0

Es gibt zwei Probleme:

  1. Die zweiten imshow entfernt den Text (hold on Fixes es)
  2. Das neue Bild über den Text platziert wird. Dieses Problem kann gelöst werden, indem uistack:

    pic_handle = imshow('pic1.bmp'); 
    h1=text(100, 20, 'my text'); 
    h2=text(20, 100, 'more text'); 
    hold on 
    imshow('pic2.bmp'); 
    delete(pic_handle); 
    uistack(h1,'top') 
    uistack(h2,'top') 
    
+0

kurz nach der Veröffentlichung dämmerte es mir, dass "festhalten" würde den Trick tun, wie Sie vorschlagen. Interessanterweise wird das neue Bild * nicht * über dem Text platziert. Die Uistack-Befehle werden nicht benötigt. Ich bin mir nicht einmal sicher, ob sie in diesem Zusammenhang funktionieren würden, denn das Problem ist die Anzeigereihenfolge der Kinder des Achsenfensters. Nach dem, was ich in anderen Posts gelesen habe, besteht die Möglichkeit, das Array von Kindern neu zu ordnen. – Llaves

+0

Es scheint so zu sein, was "uistack" tut, das Array von Kindern neu anzuordnen. – jodag

+0

Ich habe mir kurz die Quelle von Uistack angeschaut und das ist es auch. Aber es gibt auch andere "Regeln". Wie ich im obigen Kommentar notiert habe, ist das neue Bild * nicht * über den zuvor gezeichneten Textobjekten. In der Tat habe ich versucht, das Bild mit 'uistack' nach oben zu bewegen und es hat keine Wirkung. Eine der Regeln ist offensichtlich, dass das Bild unten im Rendering-Stack liegen muss. – Llaves

0

AVK hat wahrscheinlich eine richtige Antwort als ich, aber ich werde diese sowieso posten.

Es ist möglich, die in der Abbildung gespeicherten Daten direkt zu ersetzen. Wenn Sie ein wenig im Zahlenspeicher herumstöbern, können Sie herausfinden, wo die Daten gespeichert sind, und sie ersetzen. Mit diesem Code wird die Größe der Figur nicht geändert, wenn das Bild größer oder kleiner als das Original ist.

% read some data 
h = imshow('ngc6543a.jpg'); 
text(20,20, 'my text', 'Color', 'red'); 
text(20,50, 'more text', 'Color', 'blue'); 

% get a different image 
imdata2 = imread('circuit.tif'); 
height = size(imdata2,1); 
width = size(imdata2,2); 

% replace the data in the figure 
set(h, 'CData', imdata2); 
set(h, 'YData', [1 height]); 
set(h, 'XData', [1 width]); 
Verwandte Themen