打开新图像时如何在 Matlab 轴 window 中保留文本对象?
How do I preserve text objects in a Matlab axes window when opening a new image?
我的程序打开一张图片
pic_handle = imshow('pic.bmp');
然后添加一些文本对象
text(x, y, 'my text');
text(x2, y2, 'more text');
然后用户稍后可以select打开另一个图像,从而导致
imshow('pic2.bmp');
delete(pic_handle);
现在我所有的文字都消失了。仔细查看后,我发现显示列表已被清除,文本对象的句柄似乎无效(对此我不确定)。
我的问题是是否有一些方法可以保留文本?即,在不破坏显示列表的情况下在轴对象中打开一个新图像?
这里有两个问题:
- 第二个
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 可能有比我更合适的答案,但我还是 post 这个。
可以直接替换图中存储的数据。在图形内存中翻找一下,您可以找到数据的存储位置并替换它。如果图像大于或小于原始图像,此代码不会调整您的图形大小。
% 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]);
我的程序打开一张图片
pic_handle = imshow('pic.bmp');
然后添加一些文本对象
text(x, y, 'my text');
text(x2, y2, 'more text');
然后用户稍后可以select打开另一个图像,从而导致
imshow('pic2.bmp');
delete(pic_handle);
现在我所有的文字都消失了。仔细查看后,我发现显示列表已被清除,文本对象的句柄似乎无效(对此我不确定)。
我的问题是是否有一些方法可以保留文本?即,在不破坏显示列表的情况下在轴对象中打开一个新图像?
这里有两个问题:
- 第二个
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 可能有比我更合适的答案,但我还是 post 这个。
可以直接替换图中存储的数据。在图形内存中翻找一下,您可以找到数据的存储位置并替换它。如果图像大于或小于原始图像,此代码不会调整您的图形大小。
% 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]);