1

我有很多尺寸过大(高度、宽度)的 jpeg 图像,它们都有不同的尺寸和不同的纵横比。

我从这样的数据库中显示它们:

<img src="<?php echo $img1; ?>" width="300" height="400">

我想要的是某种 php 函数来显示图像的裁剪版本,如下所示:

cropjpeg('$img1');

例如,如果图像是 600 W、700 H,则让 php 或 GD 从图像的左上角开始显示 300 W、400 H 左右的裁剪版本。

一些警告:

  1. 我不能用 CSS 来做faux cropping。如果您下载这个裁剪后的图像,它需要就是那个,较小的裁剪版本。

  2. 我真的不想创建和保存新图像,所以我想我需要它来“即时”工作

  3. 我尝试了 imagecreatefromjpeg 和 imagejpeg,但看起来好像header('Content-Type: image/jpeg');不是正确的答案,因为 html 页面上的内容不仅仅是这 1 张图片

  4. 网站流量很大,所以要小心翼翼

这是迄今为止我发现的最好的,但它使用header('Content-Type: image/jpeg');

<?php
    function cropjpeg($img, $x, $y, $width, $height,$grade=5)
    {
        // Create image instances
        $src = imagecreatefromjpeg($img);
        $dest = imagecreatetruecolor(400, 300);

        // Copy
        imagecopy($dest, $src, 0, 0, 20, 13, 400, 300);

        // Output and free from memory
        header('Content-Type: image/jpeg');
        imagejpeg($dest);

        imagedestroy($dest);
        imagedestroy($src);
    }
    cropjpeg('images/bikini.jpg');

?>

有任何想法吗?

4

3 回答 3

2

您无法在实际的 html 页面中裁剪图像,因为它需要处理,如果您不想将其保存在磁盘上。

您可以将裁剪脚本转储到带有标题的单个 PHP 文件中,并从 HTML 调用带有路径的脚本,例如:

<img src="http://www.example.org/crop.php?i=bikini.jpg&x=13&y=20&w=400&h=300" alt="" />

在脚本中你可以使用

<?php

     header('Content-Type: image/jpeg');
     function cropjpeg($img, $x, $y, $width, $height,$grade=5) {
         //......................
         imagecopy($dest, $src, 0, 0, $x, $y, $width, $height);
         //......................
     }

     cropjpeg('images/'.$_GET['i'], (int)$_GET['x'], (int)$_GET['y'], (int)$_GET['w'], (int)$_GET['h']);
?>

您应该考虑纵横比,并寻找更好的裁剪脚本,您不必重新发明轮子。

于 2012-08-25T07:33:43.377 回答
0

使用 mod_rewrite 将相关图像文件路径的请求发送到 PHP 脚本,该脚本进行裁剪并将图像数据发送回作为响应。它看起来像页面上的普通图像标签,但图像实际上是由您的单独脚本提供的。

唯一的问题是您同时不想保存裁剪的文件,但有很多流量所以想“轻描淡写”。你不能两全其美。如果您不想在每次请求时重新裁剪图像,则需要保存裁剪后的版本,以便在以后的请求中重新提供它们。

于 2012-08-25T07:29:30.320 回答
0

这是一个包含非常完整教程的页面,其中包含使用 ajax 执行此操作所需的一切

用 jquery 和 php 裁剪

[http://www.skillcorp.com.ve][2]

[2]:http ://www.skillcorp.com.ve这里还有更多相关信息

于 2012-08-25T08:17:28.093 回答