0

コード

$files = scandir("images");
$exclude = array(".", "..");

$images = array_diff($files, $exclude);

foreach($images as $image) {

    $original_image  = imagecreatefromjpeg("images/{$image}");
    $original_width  = imagesx($original_image);
    $original_height = imagesy($original_image);

    $new_width  = 180;
    $new_height = floor($original_height * ($new_width/$original_width));
    $new_image  = imagecreatetruecolor($new_width, $new_height);

    imagecopyresampled($new_image, $original_image, 0, 0, 0, 0, $new_width, $new_height, $original_width, $original_height);

    header("Content-Type: image/jpeg");

    imagejpeg($new_image);
}

問題

コードのサイズ変更部分は正常に機能しますが、サイズ変更された最初の画像しか出力しません。サイズ変更されたすべての画像をダンプするようにするにはどうすればよいですか?

4

2 に答える 2

2

あなたがやっているようなやり方はできません。imagejpeg画像のバイトを「印刷」します(これが、適切なヘッダーと組み合わせて、ブラウザにその画像が表示される理由です)。ただし、最初の画像のバイトを「変更」していて、新しい画像を出力に追加していないため、複数の画像を印刷する (さらにヘッダーを変更しようとする) ことはできません。そのようなソリューションを使用したい場合は、次のことができます。

  1. すべての画像をサーバーに保存してから、別の方法でそれらの画像にアクセスします (画像を<img>指すタグを印刷するか、画像をリストする何らかの構造をスローします)。

  2. それらを保存したくない場合は、いつでもbase64を使用してバイトをエンコードし、それを次のように使用できます<img src>

    ob_start ();
    imagejpeg ($new_image);
    $image_data = ob_get_contents ();
    ob_end_clean ();
    $image_data_base64 = base64_encode ($image_data);
    echo '<img src="data:image/jpg;base64,'.$image_data_base64.'" />';
    

毎回そうすべきです。

そして非常に重要imagedestroy($new_image)です: phpで画像オブジェクトを出力した後(または作業を終了した後)に常に使用してください。

于 2013-01-30T15:14:34.477 に答える
1

The line :

header("Content-Type: image/jpeg");

make your browser understand that your content is an image.

That's about if you select 2 images in a folder, right-click and open them. Your images will not be displayed together as if they were only one.

One way to do your job is to create a page that does 2 things :

  • display an image if it has arguments
  • display all images as <img> tags if it has no argument

Here is an example.

// The argument is set: we display one image as png
if (array_key_exists('img', $_GET)) {

    $image = $_GET['img'];

    // security: prevents access to unauthorized directories (by giving "../../file.jpg" as file)
    $goodPath = realpath('images');
    $wantedImage = realpath("images/{$image}");
    if (strncmp($wantedImage, $goodPath, strlen($goodPath)) != 0) {
        die();
    }

    // if user wants an image that does not exists, we prevent GD errors
    if (!is_file($wantedImage))
    {
        die();
    }

    // and your code here, to display only ONE image

    $original_image  = imagecreatefromjpeg("images/{$image}");
    $original_width  = imagesx($original_image);
    $original_height = imagesy($original_image);

    $new_width  = 180;
    $new_height = floor($original_height * ($new_width/$original_width));
    $new_image  = imagecreatetruecolor($new_width, $new_height);

    imagecopyresampled($new_image, $original_image, 0, 0, 0, 0, $new_width, $new_height, $original_width, $original_height);

    header("Content-Type: image/jpeg");
    imagejpeg($new_image);
    die();

// No argument: we display all images as image tags
} else {

    // security: prevents from xss exploits 
    $self = htmlentities($_SERVER['PHP_SELF']);

    // glob will get all files that matches your pattern
    $files = glob("images/*.[jJ][pP][gG]");

    // display image tags
    foreach ($files as $image) {
       $image = htmlentities($image);
       echo "<img src='{$self}?img={$image}' />";
    }

    die();

}
于 2013-01-30T20:22:22.040 に答える