【问题标题】:updating data within same GUI in MATLAB在 MATLAB 中更新同一 GUI 中的数据
【发布时间】:2013-08-05 18:02:14
【问题描述】:

我在 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);

假设首先说如果我裁剪图像,然后下一步如果我改变裁剪图像的亮度稍后对上面编辑的图像进行一些其他操作,我如何将一个操作与另一个操作链接?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您需要为图像设置一个全局变量,而不是文件名的全局变量。因此,在您的每个回调中,您都可以操作您的图像,而无需每次都读取图像。此外,您应该在每次回电结束时通过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);
      

      【讨论】:

      • 我有很多 GUI。但此窗口仅用于编辑图像,我使用getappdata 从其他 GUI 将图像输入到此窗口。在哪里使用这个handles.image
      • 您使用的图像与您在其他 GUI 中使用的图像不同。您只有文件名fname(您的原始图像)的全局变量,并且每次您想编辑图像时都通过imread(fname) 重新加载原始图像。因此,您的更改不会保存在一个共同的地方,下次您需要它们时它们就会消失。此外,由于您需要多个 GUI 中的图像,请忘记我使用 handles 的第二种方法。
      【解决方案3】:

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

      换句话说,替换

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

      x = getimage(handles.axes1);

      我没有测试代码,但它应该可以通过最少的工作解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-24
        • 2013-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多