|
|
|
| Здравствуйте, я с php не очень, но вот у меня есть код который работает только в jpeg
<?
define("ROOT", $_SERVER["DOCUMENT_ROOT"] . '/' );
define("FILES", ROOT . "files/image/");
define("TMPDIR", ROOT . "temp/");
$filename = isset($_GET['s']) ? str_replace("../", "", $_GET['s']) : '';
$filename = str_replace("../", "", $filename);
$filename = str_replace(array("\"", "'"), "", $filename);
$width = isset($_GET['w']) ? $_GET['w'] : 0;
$height = isset($_GET['h']) ? $_GET['h'] : 0;
$tr = isset($_GET['tr']) ? $_GET['tr'] : 'rz';
$ct = 'image/jpeg';
$content = '';
$sDir = isset($_REQUEST['tmp']) ? TMPDIR: ROOT;
$filename = $sDir.$filename;
if(is_file($filename)) {
$ftime = filectime($filename);
$fcname = TMPDIR . urlencode($filename)."_".$width."_".$height."_".$tr;
if(is_file($fcname)) {
$fp = fopen($fcname, "r");
if (flock($fp, LOCK_EX)) {
while($data = fread($fp, 8192)) $content .= $data;
flock($fp, LOCK_UN);
fclose($fp);
}
} else {
$pImage = getimagesize( $filename );
if($pImage[2] == 1) { $ct = 'image/gif'; $up_image = imagecreatefromgif($filename); }
elseif($pImage[2] == 2) { $ct = 'image/jpeg'; $up_image = imagecreatefromjpeg($filename); }
elseif($pImage[2] == 3) { $ct = 'image/png'; $up_image = imagecreatefrompng($filename); }
else $up_image = null;
if($up_image != null) {
if($width == 0 && $height == 0) { $width = $pImage[0]; $height = $pImage[1]; }
if($width == 0) { $width = round($pImage[0]*$height/$pImage[1], 0); }
elseif($height == 0) { $height = round($pImage[1]*$width/$pImage[0], 0); }
if($tr == "sq") {
$xt = 0; $yt = 0;
$dimt = $width;
$xf = ($pImage[0]>$pImage[1]) ? intval(($pImage[0]-$pImage[1])/2) : 0;
$yf = ($pImage[0]>$pImage[1]) ? 0 : intval(($pImage[1]-$pImage[0])/2);
$dimf = ($pImage[0]>$pImage[1]) ? $pImage[1] : $pImage[0];
$fr_rect = array("x"=>$xf, "y"=>$yf, "w"=>$dimf, "h"=>$dimf);
$to_rect = array("x"=>$xt, "y"=>$yt, "w"=>$dimt, "h"=>$dimt);
} else {
$fr_rect = array("x"=>0, "y"=>0, "w"=>$pImage[0], "h"=>$pImage[1]);
$to_rect = array("x"=>0, "y"=>0, "w"=>$width, "h"=>$height);
}
// 1-1223580133.jpg
$nImage = imagecreatetruecolor($to_rect["w"], $to_rect["h"]);
imagecopyresampled($nImage, $up_image, $to_rect["x"], $to_rect["y"], $fr_rect["x"], $fr_rect["y"],
$to_rect["w"], $to_rect["h"], $fr_rect["w"], $fr_rect["h"]);
ob_start();
imagejpeg($nImage, null, 100);
$content = ob_get_contents();
ob_end_clean();
imagedestroy($nImage);
imagedestroy($up_image);
file_put_contents($fcname, $content);
} else $content = file_get_contents(FILES."default.gif");
}
} else $content = file_get_contents(FILES."default.gif");
header("Content-Type: ".$ct);
echo $content;
?>
|
я так и не догнал, как сделать, чтоб работал и с gif и с png и сохранял прозрачность.
Пожалуйста подскажите | |
|
|
|
|
|
|
|
|
для: KPETuH
(29.04.2014 в 10:40)
| | поставил
imagepng($nImage, null, 100);
|
всё равно сохраняет в jpeg
видимо я совсем тупень :) | |
|
|
|
|
|
|
|
для: tcfreestyle
(29.04.2014 в 16:40)
| | и куда поставили? | |
|
|
|
|
|
|
|
для: KPETuH
(29.04.2014 в 17:23)
| | изменил это $ct = 'image/jpeg'; на png стал сохранять png
спасибо, что не прошли мимо | |
|
|
|
|
|
|
|
для: tcfreestyle
(29.04.2014 в 02:09)
| | $filename = str_replace("../", "", $filename); - basename().
$filename = str_replace(array("\"", "'"), "", $filename); - stripslashes().
И вообще, это для чего столько наворочано, для вывода малых на лету?
| |
|
|
|
|
|
|
|
для: confirm
(29.04.2014 в 17:55)
| | Да на лету, так досталось :)
помогло это
http://stackoverflow.com/questions/279236/how-do-i-resize-pngs-with-transparency-in-php
Всем спасибо что не прошли мимо | |
|
|
|
|
|
|
|
для: tcfreestyle
(29.04.2014 в 18:19)
| | А может лучше один раз готовить эскизы при загрузке, а не грузить сервер пустым?
А код настолько громоздкий и безграмотный, что просто нет слов. | |
|
|
|
|
|
|
|
для: confirm
(29.04.2014 в 18:20)
| | Я согласен полностью :) но пока наследие такое и к сожалению выставили другие приоритеты
И я не настолько в php чтоб прям всё переписывать | |
|
|
|
|
|
|
|
для: tcfreestyle
(29.04.2014 в 18:28)
| | Судя по этой строке - $content = file_get_contents(FILES."default.gif"); не идет ли речь об аватарах?
Если да, то не вдаваясь в то почему этот скрипт безобразен, можно отдать все это на откуп браузера. То есть, если исходные изображения не так и разнятся от получаемых малых размеров, то проще прописать в стилях изображений фиксированный размер ширины, а высоту как auto. | |
|
|
|
|
|
|
|
для: confirm
(29.04.2014 в 18:32)
| | Нет это не аватары, а прозрачная картинка по умолчанию на случай если не залита нужная, кстати да размер фиксированный там 50 ширина | |
|
|
|
|
|
|
|
для: tcfreestyle
(29.04.2014 в 18:35)
| | > прозрачная картинка по умолчанию
И для чего эта картинка? Для наложения как логотип? Хотел бы я посмотреть логотип с ограниченной палитрой наложенный на полноцветные изображения. Ну помилуйте, это же глупость, если только логотип не Черный квадрат Малевича.
Если ширина исходного не слишком отличается от большого, то лучше стилями.
Да и вообще, если изображения типа "для галереи", то простым списком без всяких скриптов можно сделать неплохую галерею.
Если же нечто иное, то лучше добавить в код загрузки изображений сохранение малых их копий. | |
|
|
|
|
|
|
|
для: confirm
(29.04.2014 в 18:41)
| | Спасибо за совет | |
|
|
|