在php中通过标题发送时更改图像宽度

时间:2010-10-16 22:17:54

标签: php image

我有这段代码调用随机图像并将其发送到另一页。该页面通过图像链接调用此脚本。我想弄清楚的是如何在图像超过我的最大宽度时指定图像宽度。我得到了这么远然后完全失去了。

 <?php

    $folder = '';

    $exts = 'jpg jpeg png gif';

    $files = array(); $i = -1; 
    if ('' == $folder) $folder = './';

    $handle = opendir($folder);
    $exts = explode(' ', $exts);
    while (false !== ($file = readdir($handle))) {
    foreach($exts as $ext) { 
    if (preg_match('/\.'.$ext.'$/i', $file, $test)) { 
    $files[] = $file; 
    ++$i;
    }
    }
    }
    closedir($handle);
    mt_srand((double)microtime()*1000000); 
    $rand = mt_rand(0, $i); 

    $image =($folder.$files[$rand]); 

    if (file_exists($image))
    {
      list($width) = getimagesize($image);
      $maxWidth = 150;
      if ($width > $maxWidth)
      {
        header('Location: '.$folder.$files[$rand]); // Voila!;
      }
      else
      {
        header('Location: '.$folder.$files[$rand]); // Voila!
      }
    }
    ?>

4 个答案:

答案 0 :(得分:0)

您无法在标题中指定。有两种方法可以解决这个问题。

1:在图片标签中,指定宽度属性,但这会强制较小的图像也可以放大,所以可能不是最好的操作过程。

2:使用GD库动态调整图像大小并发送结果图像而不是原始图像。

编辑:

对于调整大小,您可以查看使用图像调整大小类这个非常简单的方法。 http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php

include('SimpleImage.php');
$image = new SimpleImage();
$image->load('picture.jpg');
$image->resizeToWidth($maxWidth);
$image->save('picture2.jpg');

现在您可以重定向到picture2.jpg或内联发送图像内容。此外,如果经常使用图像,则检查脚本顶部,如果调整大小的图像存在,是否确实发送,否则继续调整大小。

答案 1 :(得分:0)

您可以使用CSS max-widthmax-height属性。

答案 2 :(得分:0)

这里有几个调整大小的函数,我认为其中至少有一个保持宽高比。

function resize_image($file, $w, $h, $crop = false) {
    list($width, $height) = getimagesize($file);
    $r = $width / $height;
    if ($crop) {
        if ($width > $height) {
            $width = ceil($width-($width*($r-$w/$h)));
        } else {
            $height = ceil($height-($height*($r-$w/$h)));
        }
        $newwidth = $w;
        $newheight = $h;
    } else {
        if ($w/$h > $r) {
            $newwidth = $h*$r;
            $newheight = $h;
        } else {
            $newheight = $w/$r;
            $newwidth = $w;
        }
    }
    $src = imagecreatefromjpeg($file);
    $dst = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

    return $dst;
}

并且:

function thumb_aspect_crop($source_path, $desired_width, $desired_height) {
    list( $source_width, $source_height, $source_type ) = getimagesize($source_path);

    switch ($source_type) {
        case IMAGETYPE_GIF:
            $source_gdim = imagecreatefromgif($source_path);
            break;

        case IMAGETYPE_JPEG:
            $source_gdim = imagecreatefromjpeg($source_path);
            break;

        case IMAGETYPE_PNG:
            $source_gdim = imagecreatefrompng($source_path);
            break;
    }

    $source_aspect_ratio = $source_width / $source_height;
    $desired_aspect_ratio = $desired_width / $desired_height;

    if ($source_aspect_ratio > $desired_aspect_ratio) {
        // Triggered when source image is wider
        $temp_height = $desired_height;
        $temp_width = (int) ( $desired_height * $source_aspect_ratio );
    } else {
        // Triggered otherwise (i.e. source image is similar or taller)
        $temp_width = $desired_width;
        $temp_height = (int) ( $desired_width / $source_aspect_ratio );
    }

    // Resize the image into a temporary GD image
    $temp_gdim = imagecreatetruecolor($temp_width, $temp_height);
    imagecopyresampled(
            $temp_gdim,
            $source_gdim,
            0, 0,
            0, 0,
            $temp_width, $temp_height,
            $source_width, $source_height
    );

    // Copy cropped region from temporary image into the desired GD image
    $x0 = ( $temp_width - $desired_width ) / 2;
    $y0 = ( $temp_height - $desired_height ) / 2;

    $desired_gdim = imagecreatetruecolor($desired_width, $desired_height);
    imagecopy(
            $desired_gdim,
            $temp_gdim,
            0, 0,
            $x0, $y0,
            $desired_width, $desired_height
    );

    return $desired_gdim;
}

答案 3 :(得分:0)

尝试使用Primage class,例如example