2013-08-05 2 views
0

Я создал одно окно редактора изображений в MATLAB, которое включает в себя различные операции, включая яркость, контрастность, обрезку, поворот и т. Д. В этом графическом интерфейсе каждая операция имеет свои собственные обратные вызовы функций.Обновление данных в пределах того же GUI в MATLAB

Моя проблема связана со связыванием одной функции с другой. если я обрезаю изображение, то, если я изменяю яркость, мой текущий код изменяет яркость исходного изображения, а не обрезанное изображение. Аналогично сначала я, если меняю яркость, а затем, если я обрезаю, мой код обрезает исходное изображение, а не просветленное изображение.

Ниже код должен изменить яркость.

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

Пусть говорят сначала, если я обрезать изображение, то следующий шаг, если я изменить яркость обрезанного изображения позже некоторые другие операции на выше отредактированного изображения, как я могу связать одну операцию с другой?

ответ

1

Я думаю, это потому, что вы не обновляете свои ручки после их изменения, поэтому код по-прежнему относится к старому дескриптору.

Попробуйте guidata(hObject, handles); сразу после обрезки.

0

Вместо того, чтобы загружать исходный файл изображения для выполнения ваших манипуляций, загрузите изображение с рисунка.

Другими словами, заменить

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

с

x = getimage(handles.axes1);

Я не проверял код, но он должен решить вашу проблему с минимальным количеством работы.

1

Вместо того, чтобы иметь глобальную переменную для имени файла, для изображения требуется глобальная переменная. Таким образом, в каждом из ваших обратных вызовов вы можете манипулировать своим изображением без прочтения изображения каждый раз. Кроме того, вы должны сохранить свои изменения в конце каждого обратного звонка на setappdata. Таким образом, ваши обратные вызовы будет что-то вроде этого:

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

% manipulation on image 
% show image 

setappdata(0, 'image', image); 

Если у вас есть один GUI, я думаю, было бы удобнее, если вы делаете такую ​​вещь с handles. То есть, загрузить изображение в графическом интерфейсе и держать его так:

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

Тогда ваши обратные вызовы будет выглядеть так:

function changeimage_Callback(hObject, eventdata, handles) 

% manipulation on handles.image 
% show handles.image 

guidata(hObject, handles); 
+0

Я много графического интерфейса. Но это окно предназначено только для редактирования изображения, где я вводил изображение в это окно из другого графического интерфейса, используя 'getappdata'. где использовать этот 'handles.image'? – Chethan

+0

Вы не используете одно и то же изображение, которое вы используете в других графических интерфейсах. У вас есть только глобальная переменная для имени файла 'fname' (ваше исходное изображение) и перезагружайте исходное изображение' imread (fname) 'каждый раз, когда вы хотите отредактировать свой образ. Поэтому ваши изменения не сохраняются в общем месте, и в следующий раз, когда они вам понадобятся, они исчезают. Более того, поскольку вам нужно изображение в нескольких графических интерфейсах, забудьте мой второй подход, используя 'handles'. – Barpa

Смежные вопросы