我在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);
假设首先说我是否裁剪图像,然后下一步如果我在上面编辑的图像上更改了裁剪图像的亮度,我将如何将一个操作与另一个操作相关联?
答案 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);
我没有测试代码,但它应该用最少量的工作来解决你的问题。