function show(I,M)
%show - show content aware image resizing
%
% show(I,M) opens a figure window to allow interactive resizing of I
% in one direction based on the seam removal map M.
%
% See also removalMap.
% figure out if seams are horizontal or vertical
[h,w] = size(M);
horiz = all(sum(M,1)==sum(1:h))
vert = all(sum(M,2)==sum(1:w))
if ~xor(horiz,vert), error('seams not horizontal or vertical?!'); end
fh = figure; clf;
set(fh,'DoubleBuffer','on');
set(fh,'WindowButtonDownFcn',@mouseDown);
set(fh,'WindowButtonMotionFcn',@mouseMove);
set(fh,'WindowButtonUpFcn',@mouseUp);
set(fh,'WindowScrollWheelFcn',@mouseWheel);
% set(fh,'Interruptible','off');
% set(fh,'BusyAction','queue');
if horiz,
ih = imshow(cat(1,I,I));
title('horizontal seams');
else
ih = imshow(cat(2,I,I));
title('vertical seams');
end
set(ih,'CData',I);
if ~horiz,
I = permute(I,[2,1,3]);
M = M';
end
[h,w] = size(M);
n = 0; % how many seams we are removing
% remove an additional dn seams
function move(dn)
n = n + dn;
if n >= 0, % shrink image
if horiz,
set(ih,'CData',shrink(I,M,n));
else
set(ih,'CData',permute(shrink(I,M,n),[2,1,3]));
end
else % grow image
if horiz,
set(ih,'CData',expand(I,M,-n));
else
set(ih,'CData',permute(expand(I,M,-n),[2,1,3]));
end
end
drawnow;
end
p0 = []; % location of mouse down event
drag = false; % is the mouse being dragged?
moving = false; % are we moving the image?
function mouseDown(src,evt)
p0 = get(fh,'CurrentPoint');
drag = true;
end
function mouseMove(src,evt)
if ~drag, return; end
if moving, return; end % serialize execution of this function
moving = true;
p = get(fh,'CurrentPoint');
if horiz,
move( p(2) - p0(2) );
else
move( p0(1) - p(1) );
end
p0 = p;
moving = false;
end
function mouseWheel(src,evt)
move( -evt.VerticalScrollCount * evt.VerticalScrollAmount );
end
function mouseUp(src,evt)
drag = false;
end
end