Поворот изображения на той же странице

#php

#php

Вопрос:

Я хочу повернуть загруженное и полученное изображение из одного места. Да, я почти закончил. Но проблема в том, что из-за заголовка («content-type: image / jpeg») страница перенаправляется в другой / или формат изображения. Я хочу отобразить его на той же странице, что и исходное изображение. Вот мой код..

      $imgnames="upload/".$_SESSION["img"];
     header("content-type: image/jpeg");
     $source=imagecreatefromjpeg($imgnames);
     $rotate=imagerotate($source,$degree,0); 
     imagejpeg($rotate);
  

я также сделал со свойством css.

    echo "<img src='$imgnames' style='image-orientation:".$degree."deg;' />";
  

Но в любом случае моя задача — выполнять только с помощью php. Пожалуйста, направьте меня или дайте любую имеющуюся у вас ссылку

заранее спасибо.

Комментарии:

1. Вы можете сделать это, например, с помощью jQuery (или простого Javascript: вы начинаете с <img id="rotImg" /> и делаете document.getElementById('rotImg').src = "rotator.php?id=..."; . Однако ваш скрипт загрузки должен будет сохранить повернутое изображение где-нибудь на сервере.

2. да, спасибо за помощь. Но моя задача в том, что это должно быть сделано только с помощью php. Не использовать css, jquery

Ответ №1:

 <?php
    // Okay, so in your upload page 
    $imgName  = "upload/".$_SESSION["img"];
    $source=imagecreatefromjpeg($imgName);
    $rotate=imagerotate($source, $degree,0); 


    // you generate  a PHP uniqid, 
    $uniqid = uniqid();

    // and use it to store the image

    $rotImage = "upload/".$uniqid.".jpg";

    // using imagejpeg to save to a file; 

    imagejpeg($rotate, $rotImage, $quality = 75);

    // then just output a html containing ` <img src="UniqueId.000.jpg" />` 
    // and another img tag with the other file.

    print <<<IMAGES
       <img src="$imgName" />
       <img src="$rotName" />
IMAGES;

    // The browser will do the rest.
?>
  

Обновить

На самом деле, хотя uniqid() обычно это работает, мы хотим использовать uniqid() для создания файла. Это специализированное использование, для которого существует лучшая функция, tempnam() .

Тем не менее, tempnam() не позволяет указывать пользовательское расширение, и многие браузеры отказываются загружать файл JPEG с именем «foo» вместо «foo.jpg «.

Чтобы быть более уверенным, что не будет двух одинаковых уникальных имен, мы можем использовать

     $uniqid = uniqid('', true);
  

добавление параметра «true» для получения более длинного имени с большей энтропией.

В противном случае нам нужна более гибкая функция, которая проверит, существует ли уникальное имя, и, если да, сгенерирует другое: вместо

     $uniqid = uniqid();
    $rotImage = "upload/".$uniqid.".jpg";
  

мы используем

     $rotImage = uniqueFile("upload/*.jpg");
  

где uniqueFile()

 function uniqueFile($template, $more = false) {
    for ($retries = 0; $retries < 3; $retries  ) {
        $testfile = preg_replace_callback(
             '#\*#',                          // replace asterisks
             function() use($more) { 
                 return uniqid('', $more);     // with unique strings
             },
             $template                         // throughout the template
        );
        if (file_exists($testfile)) {
            continue;
        }
        // We don't want to return a filename if it has few chances of being usable
        if (!is_writeable($dir = dirname($testfile))) {
            trigger_error("Cannot create unique files in {$dir}", E_USER_ERROR);
        }
        return $testfile;
    }
    // If it doesn't work after three retries, something is seriously broken.
    trigger_error("Cannot create unique file {$template}", E_USER_ERROR);
}
  

Комментарии:

1. я сгенерировал идентификатор uniqid, это 539f9c4c3ee09. Но как я могу сохранить его использование? пожалуйста, объясните на примере.

2. появляется предупреждение.. Предупреждение: imagejpeg() ожидает, что параметр 3 будет длинным, строка указана в imagejpeg($rotate, $quality = 25, $rotImage);

3. да, это работает.. измените эту строку imagejpeg($rotate, $quality = 25, $rotImage) на imagejpeg($rotate, $rotImage, $quality = 25);

4. Извините. У меня всегда возникают трудности с запоминанием порядка параметров функций PHP! (кроме того, я выбрал настройку очень низкого качества)

5. @ lserni, все в порядке. uniqid — отличная идея. Я много искал в Интернете, но не могу понять вашу идею. большое спасибо

Ответ №2:

Вам нужно сгенерировать изображение отдельно — что-то вроде <img src="path/to/image.php?id=123"> . Попытка использовать его как подобную переменную не сработает.

Комментарии:

1. не могу понять ваш ответ, не могли бы вы кратко объяснить?

2. @user3746107 Вы не можете сгенерировать изображение и отправить HTML в одном запросе, как вы пытаетесь сделать в своем примере кода. Это должны быть отдельные HTTP-запросы — по сути, два PHP-скрипта, один для вывода HTML, а другой для вывода изображения.

3. на самом деле, что происходит с заголовком (content-type)? если я удалю эту строку, вывод которой на машинном языке появился в браузере, я полностью запутался в этом.

4. Это сообщает браузеру, какой тип контента вы ему предоставляете. Удаление этого означает, что браузер не знает, что файл является JPEG, и в результате он пытается отобразить его в виде текста. Это необходимо при создании изображения.