调整大小/裁剪图像以调整为布局

时间:2015-05-12 07:54:29

标签: php css gd

我遇到了将缩略图重新调整大小/缩放到所需布局的问题。我能够生成缩略图,这是裁剪/调整大小的代码。

$filename = $key.$_FILES["files"]["name"][$key];
    $filetmp = $_FILES["files"]["tmp_name"][$key];
    $filetype = $_FILES["files"]["type"][$key];
    $filesize = $_FILES["files"]["size"][$key];
    $fileinfo = getimagesize($tmp_name);
    $filewidth = $fileinfo[0];
    $fileheight = $fileinfo[1];
    // GETS FILE EXTENSION
    $fileextension = pathinfo($filename, PATHINFO_EXTENSION);
    $microtime = preg_replace('/[^A-Za-z0-9]/', "", microtime());
    $filepath = "../static/products/".$microtime.".".$fileextension;
    $filepath_thumb = "../static/products/thumbs/".$microtime.".".$fileextension;
    $filepath2 = "/static/products/".$microtime.".".$fileextension;
    move_uploaded_file($filetmp,$filepath);



if ($filetype == "image/jpeg") {
    $imagecreate = "imagecreatefromjpeg";
    $imageformat = "imagejpeg";
}

if ($filetype == "image/png") {
    $imagecreate = "imagecreatefrompng";
    $imageformat = "imagepng";
}

if ($filetype == "image/gif") {
    $imagecreate = "imagecreatefromgif";
    $imageformat = "imagegif";
}

$ratio = $filewidth * 1.0 / $fileheight; // width/height
if( $ratio > 1) {
    $new_width = 600;
    $new_height = 600/$ratio;
}
else {
    $new_width = 600*$ratio;
    $new_height = 600;
}

    $image_p = imagecreatetruecolor($new_width, $new_height); 
    $image = $imagecreate($filepath); //photo folder 

    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $filewidth, $fileheight); 
    $imageformat($image_p, $filepath_thumb);//thumb folder 

问题:

我不知道图像的文件大小是多少,但它肯定是HD / DSLR图像。现在,上面的脚本生成一个缩略图,其中= 600px,高度=图像的比例(例如600x400)

在我的布局中,我想要调整一些缩略图,我不会被扭曲,或以任何方式拉伸。容纳缩略图的容器的宽度/高度为200 x 200像素。

当缩略图在浏览器中呈现时,其尺寸会得到 每张图片 600px×401px(缩放到200px×200px)高度随机。

HTML:

<li class="column">
<div class="post-image">
<a href="http://localhost/example/products/40/">
<img src="http://localhost/example/static/products/thumbs/0446826001431411830.JPG" alt="my photo" /></a>
</div>

<div class="product-detail">
<h4 class="post-title">
<a href="/post/40/">Post title</a>
</h4>
</div>
</li>

CSS

.post-image{ width:100%; height:200px; }
.post-image img { width:auto; height:100%; min-height:200px; }

在没有宽度x高度细节的情况下,精确缩放到 200 x 200px 的解决方案是什么......

3 个答案:

答案 0 :(得分:1)

我认为实现目标的最简单方法是使用背景图像。

您必须将html更改为:

&#13;
&#13;
.post-image {
  width:200px;
  height:200px; 

  background-repeat: no-repeat;
  background-position: center center;
  /* the size makes sure it gets scaled correctly to cover the area */
  background-size: cover;
}
.post-image a {
  display: block:
  width: 100%;
  height: 100%; 
}
.post-image img {
  display: none;
}
&#13;
<div class="post-image" style="background-image: url(http://media1.s-nbcnews.com/j/newscms/2015_20/1018941/150511-ceres-bright-spots-nasa-yh-0106p_fbf0f0c348c8d1881df19c5e07c819d1.nbcnews-fp-800-520.jpg);">
  <!--                  ^^^^^ set the background image -->
  <a href="http://localhost/example/products/40/">
  <!-- You can leave the image for SEO if required or you can take it out -->
  <img src="http://localhost/example/static/products/thumbs/0446826001431411830.JPG" alt="my photo" /></a>
</div>
&#13;
&#13;
&#13;

原始图片:http://www.nbcnews.com/science/space/ceres-spots-shine-new-images-dwarf-planet-n357161

请注意,部分图像将以这种方式切断。如果要在200x200块中显示整个图像,则需要background-size: contain;,但是图像周围会有空间(上/下或左/右,具体取决于图像的方向):

&#13;
&#13;
.post-image {
  width:200px;
  height:200px; 

  background-repeat: no-repeat;
  background-position: center center;
  /* the size makes sure it gets scaled correctly to cover the area */
  background-size: contain;
  /* just to illustrate */
  background-color: yellow;
}
.post-image a {
  display: block:
  width: 100%;
  height: 100%; 
}
.post-image img {
  display: none;
}
&#13;
<div class="post-image" style="background-image: url(http://media1.s-nbcnews.com/j/newscms/2015_20/1018941/150511-ceres-bright-spots-nasa-yh-0106p_fbf0f0c348c8d1881df19c5e07c819d1.nbcnews-fp-800-520.jpg);">
  <!--                  ^^^^^ set the background image -->
  <a href="http://localhost/example/products/40/">
  <!-- You can leave the image for SEO if required or you can take it out -->
  <img src="http://localhost/example/static/products/thumbs/0446826001431411830.JPG" alt="my photo" /></a>
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

有一个非常巧妙的解决方案!你需要一个父容器作为你的图像,然后将position: absolute的图像放在这个容器中,如下所示:

<div class="imageParent">
    <img src="http://placehold.it/600x400" alt="" class="image--fitHeight" />
</div>

所需的 css

.imageParent {
    width: 200px;
    height: 200px;
    position: relative;
    overflow: hidden;
}

.image--fitHeight {
    position: absolute;
    top: -500%;
    left: -500%;
    right: -500%;
    bottom: -500%;
    margin: auto;
    min-width: 100%;
    height: auto;
}

它将图像拉伸到最小宽度为100%,并且由于容器具有overflow: hidden,因此它将覆盖父容器内以margin: auto为中心的图像。

它不会被改变/拉伸。

如果您的图像具有 16/9 的比率(因此宽度大于高度),请使用上述方法。反之亦然使用而不是min-width: 100%; height: auto您只需切换这两个:width: auto; min-height: 100%

此方法与background: cover相同,但使用真实图像

JSFIDDLE

答案 2 :(得分:0)

如果你不尊重它的比例,我认为你不能有一个没有扭曲的缩放图像。您可以剪裁图像或缩小图像,但最终会出现边带。 我会尝试查找图像是纵向还是横向,然后相应地应用css,以便图像适合您的200x200帧(这是带有css的css示例):

.post-image-portrait img { width:auto; height:200px; }
.post-image-landscape img {width:200px; height:auto;}

(我没有测试过css,你可能需要纠正它。)