CSS Muestra una imagen redimensionada y recortada

334

Quiero mostrar una imagen de una URL con un cierto ancho y alto, incluso si tiene una relación de tamaño diferente. Así que quiero cambiar el tamaño (manteniendo la relación) y luego cortar la imagen al tamaño que quiero.

Puedo cambiar el tamaño con la imgpropiedad html y puedo cortar con background-image.
¿Cómo puedo hacer las dos cosas?

Ejemplo:

Esta imagen:

ingrese la descripción de la imagen aquí


Tiene el tamaño de 800x600píxeles y quiero mostrar como una imagen de 200x100píxeles


Con imgpuedo cambiar el tamaño de la imagen 200x150px:

<img 
    style="width: 200px; height: 150px;" 
    src="http://i.stack.imgur.com/wPh0S.jpg">


Eso me da esto:

<img style="width: 200px; height: 150px;" src="https://i.stack.imgur.com/wPh0S.jpg">


Y con background-imagepuedo cortar los 200x100píxeles de la imagen .

<div 
    style="background-image:
           url('https://i.stack.imgur.com/wPh0S.jpg'); 
    width:200px; 
    height:100px; 
    background-position:center;">&nbsp;</div>

Me da

    <div style="background-image:url('https://i.stack.imgur.com/wPh0S.jpg'); width:200px; height:100px; background-position:center;">&nbsp;</div>


¿Cómo puedo hacer las dos cosas?
¿Cambiar el tamaño de la imagen y luego cortarla del tamaño que quiero?

InfoStatus
fuente

Respuestas:

475

Puede usar una combinación de ambos métodos, por ejemplo.

    .crop {
        width: 200px;
        height: 150px;
        overflow: hidden;
    }

    .crop img {
        width: 400px;
        height: 300px;
        margin: -75px 0 0 -100px;
    }
    <div class="crop">
        <img src="https://i.stack.imgur.com/wPh0S.jpg" alt="Donald Duck">
    </div>

Puede usar negativo marginpara mover la imagen dentro del <div/>.

Roborourke
fuente
99
Tenga en cuenta que si establece position: relative en la imagen contenida, deberá establecer position: relative en el div que contiene. Si no lo hace, he descubierto que IE no recortará la imagen.
Frank Schwieterman
también elimine la altura de la clase .crop img
Waqar Alamgir
@ waqar-alamgir No funcionaría si eliminaras la declaración de altura
roborourke
66
También tenga en cuenta que cuando usa CSS para recortar una imagen, el usuario todavía tiene que descargar la imagen. Puede ser mejor usar php y GD u otra biblioteca de edición de imágenes para cambiar el tamaño y recortar la imagen antes de enviarla al usuario. Todo depende de lo que desee: cargar el servidor o el ancho de banda de los usuarios.
J-Rou
15
Solo una nota para los demás: la altura y el ancho de recorte definen dónde cortar la parte inferior y derecha de la imagen. .crop img height and width escalará la imagen. .crop img margin ampliará la imagen
Frederik
138

Con CSS3 es posible cambiar el tamaño de un background-imagecon background-size, cumpliendo ambos objetivos a la vez.

Hay muchos ejemplos en css3.info .

Implementado según su ejemplo , usando donald_duck_4.jpg . En este caso, background-size: cover;es justo lo que desea: se ajusta background-imagepara cubrir toda el área del contenedor <div>y recorta el exceso (dependiendo de la relación).

.with-bg-size {
  background-image: url('https://i.stack.imgur.com/wPh0S.jpg');
  width: 200px;
  height: 100px;
  background-position: center;
  /* Make the background image cover the area of the <div>, and clip the excess */
  background-size: cover;
}
<div class="with-bg-size">Donald Duck!</div>

Joel Purra
fuente
1
Gran solución, pero una advertencia es que no es compatible con IE <9 (si eso ya le importa a alguien). Además, quería mencionar que si reemplaza la cubierta con contener para el tamaño de fondo, se escalará, pero no recortará la imagen.
devoto el
44
Para las <img />etiquetas, mire object-fit: covery los valores relacionados de la especificación de valores de imagen CSS y módulo de contenido reemplazado de nivel 3 .
Joel Purra
111

¿Intentaste usar esto?

.centered-and-cropped { object-fit: cover }

Necesitaba cambiar el tamaño de la imagen, centrarla (tanto vertical como horizontalmente) y luego recortarla.

Me alegró descubrir que se podía hacer en una sola línea CSS. Consulte el ejemplo aquí: http://codepen.io/chrisnager/pen/azWWgr/?editors=110


Aquí está el código CSSy HTMLde ese ejemplo:

.centered-and-cropped { object-fit: cover }
<h1>original</h1>
<img height="200" src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/3174/bear.jpg" alt="Bear">
    
<h1>object-fit: cover</h1>
<img class="centered-and-cropped" width="200" height="200" 
style="border-radius:50%" src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/3174/bear.jpg" alt="Bear">

Anatolii Stepaniuk
fuente
2
Gracias, creo que esta es la forma más fácil y más universal de hacerlo, pero no parece funcionar con IE: / Encuentra los documentos aquí: developer.mozilla.org/de/docs/Web/CSS/object-fit
mozzbozz
2
El ajuste de objetos CSS3 no es compatible con IE11 o EDGE (14) caniuse.com/#feat=object-fit
eye-wonder el
1
@ eye-wonder es compatible con Edge 16, que saldrá pronto. Si no es crítico y se usa con moderación, podría usarse hoy
Ray Foss
En CSS3, podemos intentar de cualquier manera img + object-fit o div + background-image. Hasta ahora, en mi experiencia, la imagen de fondo se puede utilizar para adaptarse a más condiciones.
Eric
1
A partir de ahora, esto también es compatible con Edge (no sé desde cuándo).
Gerald Schneider
20
.imgContainer {
  overflow: hidden;
  width: 200px;
  height: 100px;
}
.imgContainer img {
  width: 200px;
  height: 120px;
}
<div class="imgContainer">
  <img src="imageSrc" />
</div>

El div que contiene esencialmente recorta la imagen al ocultar el desbordamiento.

Kelly Anderson
fuente
13
img {
  position: absolute;
  clip: rect(0px, 140px, 140px, 0px);
}
<img src="w3css.gif" width="100" height="140" />
Rohit Chaudhary
fuente
8

Gracias sanchothefat.

Tengo una mejora en tu respuesta. Como crop está muy adaptado para cada imagen, estas definiciones deben estar en HTML en lugar de CSS.

<div style="overflow:hidden;">
   <img src="img.jpg" alt="" style="margin:-30% 0px -10% 0px;" />
</div>
Pedro Reis
fuente
6
img {
    position: absolute;
    clip: rect(0px,60px,200px,0px);
} 
151291
fuente
6

object-fitpuede ayudarte, si estás jugando con la <img>etiqueta

El siguiente código recortará su imagen por usted. Puedes jugar con el ajuste de objetos

img {
  object-fit: cover;
  width: 300px;
  height: 337px;
}
Hidayt Rahman
fuente
Me alegró el día: pude adjuntar esto fácilmente a una diapositiva en mi implementación de carrusel de slider slick: solución simple de objeto IMG y no tocar la "base de código del plugin slider"
andreas-supersmart
esa es la ventaja de CSS :)
Hidayt Rahman
5

Ejemplo en vivo: https://jsfiddle.net/de4Lt57z/

HTML:

<div class="crop">
  <img src="example.jpg" alt="..." />
</div>

CSS:

    .crop img{
      width:400px;
      height:300px;
      position: absolute;
      clip: rect(0px,200px, 150px, 0px);
      }

Explicación: Aquí la imagen cambia de tamaño según el valor de ancho y alto de la imagen. Y el recorte se realiza mediante la propiedad de clip.

Para obtener detalles sobre la propiedad del clip, siga: http://tympanus.net/codrops/2013/01/16/understanding-the-css-clip-property/

MD Rafee
fuente
4

En la clase de recorte, coloque el tamaño de imagen que desea que aparezca:

.crop {
    width: 282px;
    height: 282px;
    overflow: hidden;
}
.crop span.img {
    background-position: center;
    background-size: cover;
    height: 282px;
    display: block;
}

El html se verá así:

<div class="crop">
    <span class="img" style="background-image:url('http://url.to.image/image.jpg');"></span>
</div>
Dividir
fuente
3
<p class="crop"><a href="http://templatica.com" title="Css Templates">
    <img src="img.jpg" alt="css template" /></a></p> 

.crop {
    float: left;
    margin: .5em 10px .5em 0;
    overflow: hidden; /* this is important */
    position: relative; /* this is important too */
    border: 1px solid #ccc;
    width: 150px;
    height: 90px;
}
.crop img {
    position: absolute;
    top: -20px;
    left: -55px;
}
Sergey Chechaev
fuente
1

Puede poner la etiqueta img en una etiqueta div y hacer ambas cosas, pero recomendaría no escalar imágenes en el navegador. Hace un trabajo pésimo la mayor parte del tiempo porque los navegadores tienen algoritmos de escala muy simplistas. Es mejor escalar primero en Photoshop o ImageMagick, y luego servirlo al cliente agradable y bonito.

Dave Markle
fuente
1

Lo que he hecho es crear un script del lado del servidor que redimensionará y recortará una imagen en el extremo del servidor para que envíe menos datos a través del interweb.

Es bastante trivial, pero si alguien está interesado, puedo desenterrar y publicar el código (asp.net)

Robar
fuente
CGI es probablemente el método más portátil (y eficiente en ancho de banda), a menos que el OP tenga la intención de permitir al usuario realizar su propio cambio de tamaño y recorte a través de Javascript.
extraño
1

Hay servicios como Filestack que harán esto por usted.

Toman su url de imagen y le permiten cambiar su tamaño utilizando los parámetros de url. Es bastante fácil

Su imagen se vería así después de cambiar el tamaño a 200x100 pero manteniendo la relación de aspecto

Toda la url se ve así

https://process.filestackapi.com/AhTgLagciQByzXpFGRI0Az/resize=width:200/crop=d:[0,25,200,100]/https://i.stack.imgur.com/wPh0S.jpg

pero la parte importante es solo

resize=width:200/crop=d:[0,25,200,100]

ingrese la descripción de la imagen aquí

ferrantim
fuente
buen complemento tal vez, pero igualmente, un servicio increíble (no, no me pagan por decir esto ;-)) - Literalmente me acabo de inscribir y es genial
Jonathan Lyon
1

Intenta usar la clip-pathpropiedad:

La propiedad clip-path le permite recortar un elemento a una forma básica o a una fuente SVG.

Nota: La propiedad de ruta de clip reemplazará la propiedad de clip en desuso.

img {
  width: 150px;
  clip-path: inset(30px 35px);
}
<img src="http://i.stack.imgur.com/wPh0S.jpg">

Más ejemplos aquí .

Emerica
fuente
0
<div class="crop">
    <img src="image.jpg"/>
</div>
.crop {
  width: 200px;
  height: 150px;
  overflow: hidden;
}
.crop img {
  width: 100%;
  /*Here you can use margins for accurate positioning of cropped image*/
}
Corona
fuente
0

Si está usando Bootstrap, intente usar { background-size: cover; }para <div>tal vez darle al div una clase que diga <div class="example" style=url('../your_image.jpeg');>para que se convierta div.example{ background-size: cover}

stacksonstacksonstacks
fuente
0

Necesitaba hacer esto recientemente. Quería hacer un enlace en miniatura a un gráfico NOAA. Como su gráfico podía cambiar en cualquier momento, quería que mi miniatura cambiara con él. Pero hay un problema con su gráfico: tiene un enorme borde blanco en la parte superior, por lo que si lo escala para hacer la miniatura, terminará con un espacio en blanco extraño en el documento.

Así es como lo resolví:

http://sealevel.info/example_css_scale_and_crop.html

Primero necesitaba hacer un poco de aritmética. La imagen original de NOAA es de 960 × 720 píxeles, pero los setenta píxeles superiores son un área de borde blanco superflua. Necesitaba una miniatura de 348 × 172, sin el área de borde adicional en la parte superior. Eso significa que la parte deseada de la imagen original es 720 - 70 = 650 píxeles de alto. Necesitaba reducir eso a 172 píxeles, es decir, 172/650 = 26.5%. Eso significaba que el 26,5% de 70 = 19 filas de píxeles debían eliminarse desde la parte superior de la imagen escalada.

Entonces…

  1. Establezca la altura = 172 + 19 = 191 píxeles:

    altura = 191

  2. Establezca el margen inferior a -19 píxeles (acortando la imagen a 172 píxeles de alto):

    margen inferior: -19px

  3. Establezca la posición superior en -19 píxeles (desplazando la imagen hacia arriba, de modo que las filas superiores de 19 píxeles se desborden y se oculten en lugar de las inferiores):

    arriba: -19px

El HTML resultante se ve así:

<a href="…" style="display:inline-block;overflow:hidden">
<img width=348 height=191 alt=""
style="border:0;position:relative;margin-bottom:-19px;top:-19px"
src="…"></a>

Como puede ver, elegí darle estilo a la etiqueta <a> que contiene, pero podría darle un estilo a <div>.

Un artefacto de este enfoque es que si muestra los bordes, faltará el borde superior. Como uso border = 0 de todos modos, eso no fue un problema para mí.

Dave Burton
fuente
0

Puede usar el servicio de cambio de tamaño de imagen de Kodem . Puede cambiar el tamaño de cualquier imagen con solo una llamada http. Puede usarse casualmente en el navegador o en su aplicación de producción.

  • Cargue la imagen en el lugar que prefiera (S3, imgur, etc.)
  • Conéctelo a su URL de API dedicada (desde nuestro panel de control)
Thellimist
fuente