打开新图像时,如何在Matlab轴窗口中保留文本对象?

打开新图像时,如何在Matlab轴窗口中保留文本对象?,matlab,matlab-figure,Matlab,Matlab Figure,我的程序打开一个图像 pic_handle = imshow('pic.bmp'); 然后添加一些文本对象 text(x, y, 'my text'); text(x2, y2, 'more text'); 然后,用户可以选择另一个图像打开,这将导致 imshow('pic2.bmp'); delete(pic_handle); 现在我所有的文字都消失了。在浏览了一下之后,我看到显示列表已被清除,文本对象的句柄似乎无效(不完全确定) 我的问题是,是否有办法保存文本?也就是说,在Axis对象

我的程序打开一个图像

pic_handle = imshow('pic.bmp');
然后添加一些文本对象

text(x, y, 'my text');
text(x2, y2, 'more text');
然后,用户可以选择另一个图像打开,这将导致

imshow('pic2.bmp');
delete(pic_handle);
现在我所有的文字都消失了。在浏览了一下之后,我看到显示列表已被清除,文本对象的句柄似乎无效(不完全确定)


我的问题是,是否有办法保存文本?也就是说,在Axis对象中打开一个新图像而不吹走显示列表?

这里有两个问题:

  • 第二个
    imshow
    删除文本(
    hold on
    修复)
  • 新图像将放置在文本上。此问题可以使用
    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')
    

  • AVK可能有一个比我更合适的答案,但无论如何我会发布这个

    直接替换存储在图形中的数据是可能的。在图形内存中翻一翻,你可以找到数据存储的位置并替换它。如果图像比原始图像大或小,此代码将不会调整您的体形大小

    % 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]);
    

    发帖后不久,我就明白了,正如你所说的,“坚持”就行了。有趣的是,新图像没有放置在文本上。不需要uistack命令。我甚至不确定它们是否能在这种情况下工作,因为问题是Axis窗口子窗口的显示顺序。从我在其他帖子中读到的内容来看,处理这个问题的方法是重新排列子数组。这似乎就是
    uistack
    所做的,重新排列子数组。我快速查看了uistack的源代码,事实上它就是这样做的。但也涉及到一些其他“规则”。正如我在上面的评论中所指出的,新图像不在先前绘制的文本对象之上。事实上,我尝试使用
    uistack
    将图像移动到顶部,但没有效果。因此,其中一条规则显然是,图像必须位于渲染堆栈的底部。