Imshow in App Designer (Image size doesn't fit)
74 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Erdal Schranz
am 10 Okt. 2017
Kommentiert: Francis Burton
am 7 Mär. 2021
Hey Guys,
the size of imshow in app designer doesn't fit, when I start the application (see picture and code below). Is it possible, that the image have the same size as the UiAxes in app designer?
function startupFcn(app)
imshow('Flower.jpg','parent',app.UIAxes)
end
Thank you very much for your help. Best regards Erdal
1 Kommentar
Varun Gunda
am 16 Okt. 2017
Can you share more information on what exactly you are trying to do? The explanation is not clear.
May be this code helps you out in displaying image as you are looking for:
RGB = imread('Flower.jpg');
ax = uiaxes(app.UIFigure,'Position',[10 10 390 390]);
image(RGB,'Parent',ax);
set(ax,'visible','off');
Also, check the dimensions of the 'Flower.jpg' which gets reflected on the app.
Akzeptierte Antwort
Duncan Lilley
am 18 Okt. 2017
Hello,
From my understanding of your question, you wish to display an image which will take up the entire space within the figure in an App Designer app. Consider the following code:
% Fill figure with axes and remove tick labels
app.UIAxes.Position = [0 0 app.UIFigure.Position(3:4)];
% Remove title, axis labels, and tick labels
title(app.UIAxes, []);
xlabel(app.UIAxes, []);
ylabel(app.UIAxes, []);
app.UIAxes.XAxis.TickLabels = {};
app.UIAxes.YAxis.TickLabels = {};
% Display image and stretch to fill axes
I = imshow('Flower.jpg', 'Parent', app.UIAxes, ...
'XData', [1 app.UIAxes.Position(3)], ...
'YData', [1 app.UIAxes.Position(4)]);
% Set limits of axes
app.UIAxes.XLim = [0 I.XData(2)];
app.UIAxes.YLim = [0 I.YData(2)];
This programmatically resizes and repositions the axes to fill the entire figure window. It then removes the axes title as well as the axis labels and tick labels for each axis, allowing the axes to fill the figure as much as possible.
Then, the image is displayed, and instructed to stretch to fill the axes by setting the 'XData' and 'YData' properties.
Finally, the limits of the axes are set so that no additional space is padded around the image.
If, instead of filling the entire figure, you just wish to fill the entire axes with the image, you should be able to just remove the first line.
3 Kommentare
Syed Muhammad Ali Minhal
am 30 Jan. 2021
Thankyou @Duncan Lilley
your explanation has been very useful to me. Thanks again
% Fill figure with axes and remove tick labels
app.UIAxes.Position = [0 0 app.UIFigure.Position(3:4)];
% Remove title, axis labels, and tick labels
title(app.UIAxes, []);
xlabel(app.UIAxes, []);
ylabel(app.UIAxes, []);
app.UIAxes.XAxis.TickLabels = {};
app.UIAxes.YAxis.TickLabels = {};
% Display image and stretch to fill axes
I = imshow('Flower.jpg', 'Parent', app.UIAxes, ...
'XData', [1 app.UIAxes.Position(3)], ...
'YData', [1 app.UIAxes.Position(4)]);
% Set limits of axes
app.UIAxes.XLim = [0 I.XData(2)];
app.UIAxes.YLim = [0 I.YData(2)];
Daniel Dickinson
am 23 Feb. 2021
@Duncan Lilley Thank you for your answer, you helped me figure out how to get my code to work.
However, I don't believe that what you posted above is exactly correct. In R2020a, a call to imshow appears to reset the TickLabels properties of the axes. That is, although I have set the labels to {} before calling imshow, they are reset to default values after the call and so the image still doesn't fill the whole available space.
This code worked for me in R2020a:
% Remove title and axis labels
title(app.UIAxes, []);
xlabel(app.UIAxes, []);
ylabel(app.UIAxes, []);
% Display image and stretch to fill axes
I = imshow('Flower.jpg', 'Parent', app.UIAxes, ...
'XData', [1 app.UIAxes.Position(3)], ...
'YData', [1 app.UIAxes.Position(4)]);
% Remove tick labels
app.UIAxes.XAxis.TickLabels = {};
app.UIAxes.YAxis.TickLabels = {};
% Set limits of axes
app.UIAxes.XLim = [0 I.XData(2)];
app.UIAxes.YLim = [0 I.YData(2)];
Can anyone help me understand why imshow resets the tick labels and if there is an option to stop it from doing so?
Weitere Antworten (3)
Melinda Toth-Zubairi
am 26 Mär. 2019
If your goal is just to display a static image, starting R2019a you can use the uiimage function to create an image component in your App Designer app.
See the following related answer for more information:
3 Kommentare
Francis Burton
am 7 Mär. 2021
It isn't possible to capture mouse down events in a uiimage in App Designer apps, so clicking and dragging inside an image - e.g. to draw a rubber band box for selection of points in the image - isn't possible at the moment. WindowButtonDownFcn events are intercepted/filtered when the mouse is inside the image.
So one is obliged to use UIAxes instead. This doesn't intercept mouse events in the app figure window. However, drawing images using imshow is still problemmatic I have found, using the code above. Setting the size (in pixels) of the axes to that of the image doesn't result in one-to-one pixel correspondence i.e.truesize behaviour. There is still a border around the image itself, albeit a narrow one.
There may also be performance issues with UIAxes compared to (UI)Image. Changing the image and refreshing the display seems to be slower with imshow vs setting Image.ImageSource.
Siehe auch
Kategorien
Mehr zu Environment and Settings finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!