#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, и в результате он пытается отобразить его в виде текста. Это необходимо при создании изображения.