400

我想显示来自具有特定宽度和高度的 URL 的图像,即使它具有不同的大小比例。所以我想调整大小(保持比例),然后将图像剪切到我想要的大小。

我可以使用 htmlimg属性调整大小,也可以使用background-image.
我怎样才能做到这两点?

例子:

这个图片:

在此处输入图像描述


有大小800x600像素,我想像200x100像素图像一样显示


img可以调整图像大小200x150px

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


这给了我这个:

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


并且background-image我可以剪切图像200x100像素。

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

给我:

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


我怎样才能做到这两点?
调整图像大小,然后将其剪切成我想要的大小?

4

21 回答 21

533

您可以结合使用这两种方法,例如。

    .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>

您可以使用负片margin<div/>.

于 2009-01-29T20:42:52.320 回答
149

使用 CSS3 可以改变 a 的大小background-imagebackground-size同时实现这两个目标。

css3.info上有很多例子

根据您的示例实施,使用donald_duck_4.jpg。在这种情况下,background-size: cover;这正是您想要的 - 它适合background-image覆盖容器的整个区域<div>并剪裁多余的区域(取决于比率)。

.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>

于 2012-02-05T12:17:45.970 回答
125

你试过用这个吗?

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

我需要调整图像大小、居中(垂直和水平)然后裁剪它。

我很高兴地发现,它可以在一条 css 行中完成。在此处查看示例:http ://codepen.io/chrisnager/pen/azWWgr/?editors=110


这是该示例中的CSSandHTML代码:

.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">

于 2015-05-10T10:14:06.790 回答
22
.imgContainer {
  overflow: hidden;
  width: 200px;
  height: 100px;
}
.imgContainer img {
  width: 200px;
  height: 120px;
}
<div class="imgContainer">
  <img src="imageSrc" />
</div>

包含 div 基本上通过隐藏溢出来裁剪图像。

于 2009-01-29T20:44:51.863 回答
13
img {
  position: absolute;
  clip: rect(0px, 140px, 140px, 0px);
}
<img src="w3css.gif" width="100" height="140" />
于 2014-03-12T06:38:49.273 回答
8

谢谢sanchothefat。

我对你的回答有改进。由于裁剪是为每个图像量身定制的,因此此定义应位于 HTML 而不是 CSS。

<div style="overflow:hidden;">
   <img src="img.jpg" alt="" style="margin:-30% 0px -10% 0px;" />
</div>
于 2013-11-16T12:40:08.253 回答
8

object-fit如果您正在玩<img>标签,可能会对您有所帮助

下面的代码将为您裁剪图像。你可以玩弄对象匹配

img {
  object-fit: cover;
  width: 300px;
  height: 337px;
}
于 2018-11-14T06:23:50.523 回答
6
img {
    position: absolute;
    clip: rect(0px,60px,200px,0px);
} 
于 2015-05-12T04:51:40.120 回答
6

对先前答案的一个小补充,包括object-fit: cover

对象位置

您可以使用 object-position 属性更改被替换元素的内容对象在元素框内的对齐方式。

.trimmed-cover {
  object-fit: cover;
  width: 100%;
  height: 177px;
  object-position: center 40%;
}
<img class="trimmed-cover" src="http://i.stack.imgur.com/wPh0S.jpg">

结果.gif

于 2021-04-26T10:23:11.077 回答
5

现场示例: 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);
      }

说明: 这里的图像根据图像的宽度和高度值调整大小。裁剪是由剪辑属性完成的。

有关剪辑属性的详细信息,请遵循: http ://tympanus.net/codrops/2013/01/16/understanding-the-css-clip-property/

于 2016-04-17T03:21:10.623 回答
5

尝试使用该clip-path属性:

clip-path 属性允许您将元素剪辑为基本形状或 SVG 源。

注意:clip-path 属性将替换已弃用的 clip 属性。

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

更多例子在这里

于 2020-05-05T07:58:29.067 回答
4

在裁剪类中,放置要显示的图像大小:

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

html 将如下所示:

<div class="crop">
    <span class="img" style="background-image:url('http://url.to.image/image.jpg');"></span>
</div>
于 2015-05-25T19:52:03.017 回答
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;
}
于 2013-04-09T06:30:59.323 回答
2

有像 Filestack 这样的服务可以为你做这件事。

他们获取您的图像 url 并允许您使用 url 参数调整它的大小。这很容易。

调整为 200x100 但保持纵横比后,您的图像将如下所示

整个网址看起来像这样

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

但重要的部分只是

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

在此处输入图像描述

于 2017-01-25T19:53:15.893 回答
1

您可以将 img 标签放在 div 标签中并同时执行这两种操作,但我建议您不要在浏览器中缩放图像。大多数时候它做得很糟糕,因为浏览器有非常简单的缩放算法。最好先在 Photoshop 或 ImageMagick 中进行缩放,然后将其漂亮漂亮地提供给客户。

于 2009-01-29T20:40:32.090 回答
1

我所做的是创建一个服务器端脚本,该脚本将在服务器端调整和裁剪图片的大小,以便通过互联网发送更少的数据。

这相当琐碎,但如果有人有兴趣,我可以挖掘并发布代码(asp.net)

于 2009-01-29T20:46:05.123 回答
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*/
}
于 2014-02-28T11:29:32.783 回答
0

如果您使用的是 Bootstrap,请尝试使用{ background-size: cover; }for,<div>也许给 div 一个类<div class="example" style=url('../your_image.jpeg');>,这样它就变成了 div.example{ background-size: cover}

于 2016-06-14T19:32:37.403 回答
0

我最近需要这样做。我想制作一个指向 NOAA 图表的缩略图链接。由于他们的图表可能随时更改,我希望我的缩略图随之更改。但是他们的图表有一个问题:它的顶部有一个巨大的白色边框,所以如果你只是缩放它来制作缩略图,你最终会在文档中出现多余的空白。

这是我解决它的方法:

http://sealevel.info/example_css_scale_and_crop.html

首先我需要做一点算术。来自 NOAA 的原始图像为 960 × 720 像素,但前 70 个像素是多余的白色边框区域。我需要一个 348 × 172 的缩略图,顶部没有额外的边框区域。这意味着原始图像的所需部分是 720 - 70 = 650 像素高。我需要将其缩小到 172 像素,即 172 / 650 = 26.5%。这意味着需要从缩放图像的顶部删除 70 = 19 行像素中的 26.5%。

所以……</p>

  1. 设置高度 = 172 + 19 = 191 像素:

    高度=191

  2. 将下边距设置为 -19 像素(将图像缩短为 172 像素高):

    边距底部:-19px

  3. 将顶部位置设置为 -19 像素(将图像向上移动,以便顶部 19 像素行溢出 & 被隐藏而不是底部的行):

    顶部:-19px

生成的 HTML 如下所示:

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

如您所见,我选择设置包含 <a> 标记的样式,但您也可以设置 <div> 样式。

这种方法的一个缺陷是,如果您显示边框,则顶部边框将丢失。因为无论如何我都使用border=0,所以这对我来说不是问题。

于 2017-10-22T20:52:50.897 回答
0

您可以使用 Kodem 的Image Resize Service。只需一个 http 调用,您就可以调整任何图像的大小。可以在浏览器中随意使用,也可以在您的生产应用程序中使用。

  • 将图像上传到您喜欢的地方(S3、imgur 等)
  • 将其插入您的专用 API url(来自我们的仪表板)
于 2019-09-24T06:22:24.050 回答
0

您还可以使用名为 Croppie 的工具来裁剪图像...

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<link href="https://foliotek.github.io/Croppie/croppie.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"> </script>
<script src="https://foliotek.github.io/Croppie/croppie.js"> </script>
<script src="https://foliotek.github.io/Croppie/bower_components/exif-js/exif.js"> </script>

<style>
    #page {
        background: #ffffff;
        padding: 20px;
        margin: 20px;
    }

    #demo-basic {
        width: 600px;
        height: 600px;
    }
</style>
</head>
<body>
<h1>Crop Image Demo</h1>
<input id="upload" type="file" />
<br />
<div id="page">
<div id="demo-basic"></div>
</div>

<input id="upload-result" type="button" value="Crop Image"/>
<br />
<img id="cropped-result" src=""/>

<script>
    var $uploadCrop;       

    $("#upload").on("change", function () { readFile(this); show(); });

    $("#upload-result").on("click", function (ev) {
        $uploadCrop.croppie("result", {
            type: "canvas",
            size: "viewport"
        }).then(function (resp) {
            $("#cropped-result").attr("src", resp);
        });
    });

    function show() {
        $uploadCrop = $("#demo-basic").croppie({
            viewport: { width: 100, height: 100 },
            boundary: { width: 300, height: 300 },
            enableResize: true,
            enableOrientation: true,
            mouseWheelZoom: 'ctrl',
            enableExif: true
        });
    }

    function readFile(input) {
        if (input.files && input.files[0]) {
            var reader = new FileReader();
        
            reader.onload = function (e) {
                $("#demo-basic").addClass("ready");
                $uploadCrop.croppie("bind", {
                    url: e.target.result
                }).then(function () {
                    console.log("jQuery bind complete");
                });
            
            }
        
            reader.readAsDataURL(input.files[0]);
        }
        else {
            alert("Sorry - you're browser doesn't support the FileReader API");
        }
    }
</script>
</body>
</html>
于 2021-03-22T08:20:00.887 回答