在MATLAB中更新同一GUI内的数据

时间:2013-08-05 18:02:15

标签: user-interface matlab matlab-figure matlab-guide

我在MATLAB中创建了一个图像编辑器窗口,其中包括各种操作,包括亮度,对比度,裁剪,旋转等。在此GUI中,每个操作都有自己的函数回调。

我的问题是将一个功能与另一个功能相关联。如果我裁剪图像,那么如果我改变亮度,我的当前代码会改变原始图像的亮度而不是裁剪图像。 同样地,首先我如果改变亮度然后如果我裁剪,我的代码将裁剪原始图像而不是增亮的图像。

下面的代码是改变亮度。

function slider2_Callback(hObject, eventdata, handles)
fname = getappdata(0, 'fname');
[a, map] = imread(fname);
x = ind2rgb(a, map);
b = get(handles.slider2,'value');
j = imadjust(x,[],[],b);
    axes(handles.axes1);
    imshow(j);

以下代码是裁剪

function crop_Callback(hObject, eventdata, handles)
fname = getappdata(0, 'fname');
[a, map] = imread(fname);
x = ind2rgb(a, map);
new = imcrop(x);
axes(handles.axes1);
imshow(new);

假设首先说我是否裁剪图像,然后下一步如果我在上面编辑的图像上更改了裁剪图像的亮度,我将如何将一个操作与另一个操作相关联?

3 个答案:

答案 0 :(得分:1)

我认为这是因为您在更改句柄后没有更新句柄,因此代码仍然是指旧句柄。

裁剪后立即尝试guidata(hObject, handles);

答案 1 :(得分:1)

您需要为图像设置全局变量,而不是使用文件名的全局变量。因此,在每个回调中,您可以使用图像进行操作,而无需每次都读取图像。此外,您应该在setappdata每次回拨结束时保留更改。因此,你的回调将是这样的:

function changeimage_Callback(hObject, eventdata, handles)
image = getappdata(0, 'image');

% manipulation on image
% show image

setappdata(0, 'image', image);

如果您有一个GUI,我认为如果您使用handles进行此类操作会更方便。也就是说,在GUI中加载图像并保持这样:

handles.image = imread(filename);
guidata(hObject, handles);

然后你的回调就像这样:

function changeimage_Callback(hObject, eventdata, handles)

% manipulation on handles.image
% show handles.image

guidata(hObject, handles);

答案 2 :(得分:0)

不是加载原始图像文件来执行操作,而是从图中加载图像。

换句话说,替换

fname = getappdata(0, 'fname');
[a, map] = imread(fname);
x = ind2rgb(a, map);

x = getimage(handles.axes1);

我没有测试代码,但它应该用最少量的工作来解决你的问题。