ChatGPT解决这个技术问题 Extra ChatGPT

How to maintain aspect ratio using HTML IMG tag

I am using an img tag of HTML to show a photo in our application. I have set both its height and width attribute to 64. I need to show any image resolution (e.g. 256x256, 1024x768, 500x400, 205x246, etc.) as 64x64. But by setting the height and width attributes of an img tag to 64, it's not maintaining the aspect ratio, so the image looks distorted.

For your reference my exact code is:

<img src="Runtime Path to photo" border="1" height="64" width="64">
In 2022 you probably want this answer: stackoverflow.com/a/66618563/8806907 aspect-ratio is supported by everything except ie: developer.mozilla.org/en-US/docs/Web/CSS/…

T
Turnip

Don't set height AND width. Use one or the other and the correct aspect ratio will be maintained.

.widthSet { max-width: 64px; } .heightSet { max-height: 64px; }

Another option that gives you more flexibility is to use object-fit. This allows fixed dimensions to be set for the img whilst the image itself can be presented in a number of different ways within the defined area.

img { width: 64px; height: 64px; border: 1px solid hotpink; } .fill { object-fit: fill; } .contain { object-fit: contain; } .cover { object-fit: cover; } .scale-down { object-fit: scale-down; }


... but what if you want to fix both height and width?
This makes no sense for dynamic applications. It is not known whether width or height will be at 64px, as it depends on the ratio of the image. Why is this the upvoted response?
@Mär This question was about fixed width and/or height images. Responsiveness was not a requirement of the question.
The size is fixed, the aspect ratio is not, as the question was specifically about any image of any resolution. Including resolutions smaller than 64x64.
A
AKHIL P

here is the sample one

div{ width: 200px; height:200px; border:solid } img{ width: 100%; height: 100%; object-fit: contain; }


Just a note to people who want to use this solution: object-fit is not very well supported by browsers. It is not supported by IE or Edge at all. Source: caniuse.com/#feat=object-fit
Now supported on Edge 16+, see table: w3schools.com/css/css3_object-fit.asp
I
Ilya Streltsyn

Set width and height of the images to auto, but limit both max-width and max-height:

img {
    max-width:64px;
    max-height:64px;
    width:auto;
    height:auto;
}

Fiddle

If you want to display images of arbitrary size in the 64x64px "frames", you can use inline-block wrappers and positioning for them, like in this fiddle.


Will not scale beyond original size, only below the original size.
This worked AFTER I changed the parent to "align-items: center". The default of "align-items: stretch" was taking precedence over "max-height".
G
Glenn Teitelbaum
<img src="Runtime Path to photo"
     style="border: 1px solid #000; max-width:64px; max-height:64px;">

This is the correct solution as it continues to be independent of the orientation of the image. 3rror404's solution requires that you know whether the image is wider than it is tall or vice versa.
also set width and height to auto.
Right solution to constraint both height and width.
An image will be properly restricted by this, but not scaled beyond its original size. Though it is not certain from the opening post which of the two the OP wanted.
A
Ankit Kumar Verma

Use object-fit: contain in css of html element img.

ex:

img {
    ...
    object-fit: contain
    ...
}

A
Anonymous Coward

None of the methods listed scale the image to the largest possible size that fits in a box while retaining the desired aspect ratio.

This cannot be done with the IMG tag (at least not without a bit of JavaScript), but it can be done as follows:

 <div style="background:center no-repeat url(...);background-size:contain;width:...;height:..."></div>

Yes. Use style="background: url('_'); background-size: cover width:_px height:_px" for the <img> tag.
Thanks, @UjjwalSingh. Indeed, we need cover not contain in order to maximize the image size to the largest possible. contain leads to "letterboxing".
A
AlexElin

There's a new CSS property aspect-ratio. It sets a preferred aspect ratio for the box, which will be used in the calculation of auto sizes and some other layout functions.

img {
  width: 100%;
  aspect-ratio: 16/9;
}

It's supported in all well spread browsers.
MDN link: https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio
And https://web.dev/aspect-ratio/ contains good examples of using this property


This is what I came looking for. Bless modern CSS!
This should be the new accepted answer
K
Konstantin Dinev

Wrap the image in a div with dimensions 64x64 and set width: inherit to the image:

<div style="width: 64px; height: 64px;">
    <img src="Runtime path" style="width: inherit" />
</div>

N
Nick friesen

Try this:

<img src="Runtime Path to photo" border="1" height="64" width="64" object-fit="cover">

Adding object-fit="cover" will force the image to take up the space without losing the aspect ratio.


S
Sahan De Silva

Why don't you use a separate CSS file to maintain the height and the width of the image you want to display? In that way, you can provide the width and height necessarily.

eg:

       image {
       width: 64px;
       height: 64px;
       }

K
Kevin Taing

My site displays a number of photos (with a variety of aspect ratios) and clicking one opens it in a modal. To get it to fit into the modal without cropping, scrolling, or distortion I used the following class on my img tag

.img {
  max-height: 100%;
  max-width: 100%;
  object-fit: scale-down;
}

J
Juliano

You need a div to wrap your image to have a consistente aspect ratio.

You can use the padding-bottom trick to force the div to respect an aspect ratio and a absolute positioned image to fill the space.

The image will be also responsive, taking all the horizontal space available.

.img-frame{ width: 100%; padding-bottom: 100%; background: gray; overflow: hidden; position: relative; } .img-frame-4by3{ padding-bottom: 75%; } .img-frame-16by9{ padding-bottom: 56.25%; } .img-frame-5by1{ padding-bottom: 20%; } .img-frame img{ position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; }

4:3


16:9


5:1


F
F. Müller

With css:

.img {
    display:table-cell;
    max-width:...px;
    max-height:...px;
    width:100%;
}

Welcome to Stack Overflow! I recommend you to read How to answer a question to improve the possibilities to help the user who ask.
S
Stokely

The poster is showing a dimension constrained by height in most cases he posted >>> (256x256, 1024x768, 500x400, 205x246, etc.) but fitting a 64px max height pixel dimension, typical of most landscape "photos". So my guess is he wants an image that is always 64 pixels in height. To achieve that, do the following:

<img id="photo1" style="height:64px;width:auto;" src="photo.jpg" height="64" />

This solution guarantees the images are all 64 pixels max in height and allows width to extend or shrink based on each image's aspect ratio. Setting height to 64 in the img height attribute reserves a space in the browser's Rendertree layout as images download, so the content doesn't shift waiting for images to download. Also, the new HTML5 standard does not always honor width and height attributes. They are dimensional "hints" only, not final dimensions of the image. If in your style sheet you reset or change the image height and width, the actual values in the images attributes get reset to either your CSS value or the images native default dimensions. Setting the CSS height to "64px" and the width to "auto" forces width to start with the native image width (not image attribute width) and then calculate a new aspect-ratio using the CSS style for height. That gets you a new width. So the height and width "img" attributes are really not needed here and just force the browser to do extra calculations.


k
kennarddh

You can set aspect ratio

img { width: 64px; aspect-ratio: 1/1; }