Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Доработка скрипта по сжатию картинок
 
 автор: tcfreestyle   (29.04.2014 в 02:09)   письмо автору
 
 

Здравствуйте, я с 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']) ? TMPDIRROOT;
 
$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($fpLOCK_EX)) {
            while(
$data fread($fp8192)) $content .= $data;
                
flock($fpLOCK_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 == && $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]) ? 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($nImagenull100);
                
$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)   письмо автору
 
   для: tcfreestyle   (29.04.2014 в 02:09)
 

imagejpeg($nImage, null, 100); 

Эта строка сохраняет вам в jpg

PNG http://www.php.net/manual/ru/function.imagepng.php
GIF http://www.php.net/manual/ru/function.imagegif.php

  Ответить  
 
 автор: tcfreestyle   (29.04.2014 в 16:40)   письмо автору
 
   для: KPETuH   (29.04.2014 в 10:40)
 

поставил
 imagepng($nImage, null, 100); 

всё равно сохраняет в jpeg
видимо я совсем тупень :)

  Ответить  
 
 автор: KPETuH   (29.04.2014 в 17:23)   письмо автору
 
   для: tcfreestyle   (29.04.2014 в 16:40)
 

и куда поставили?

  Ответить  
 
 автор: tcfreestyle   (29.04.2014 в 18:19)   письмо автору
 
   для: KPETuH   (29.04.2014 в 17:23)
 

изменил это $ct = 'image/jpeg'; на png стал сохранять png
спасибо, что не прошли мимо

  Ответить  
 
 автор: confirm   (29.04.2014 в 17:55)   письмо автору
 
   для: tcfreestyle   (29.04.2014 в 02:09)
 

$filename = str_replace("../", "", $filename); - basename().
$filename = str_replace(array("\"", "'"), "", $filename); - stripslashes().

И вообще, это для чего столько наворочано, для вывода малых на лету?

  Ответить  
 
 автор: tcfreestyle   (29.04.2014 в 18:19)   письмо автору
 
   для: confirm   (29.04.2014 в 17:55)
 

Да на лету, так досталось :)

помогло это
http://stackoverflow.com/questions/279236/how-do-i-resize-pngs-with-transparency-in-php

Всем спасибо что не прошли мимо

  Ответить  
 
 автор: confirm   (29.04.2014 в 18:20)   письмо автору
 
   для: tcfreestyle   (29.04.2014 в 18:19)
 

А может лучше один раз готовить эскизы при загрузке, а не грузить сервер пустым?
А код настолько громоздкий и безграмотный, что просто нет слов.

  Ответить  
 
 автор: tcfreestyle   (29.04.2014 в 18:28)   письмо автору
 
   для: confirm   (29.04.2014 в 18:20)
 

Я согласен полностью :) но пока наследие такое и к сожалению выставили другие приоритеты
И я не настолько в php чтоб прям всё переписывать

  Ответить  
 
 автор: confirm   (29.04.2014 в 18:32)   письмо автору
 
   для: tcfreestyle   (29.04.2014 в 18:28)
 

Судя по этой строке - $content = file_get_contents(FILES."default.gif"); не идет ли речь об аватарах?
Если да, то не вдаваясь в то почему этот скрипт безобразен, можно отдать все это на откуп браузера. То есть, если исходные изображения не так и разнятся от получаемых малых размеров, то проще прописать в стилях изображений фиксированный размер ширины, а высоту как auto.

  Ответить  
 
 автор: tcfreestyle   (29.04.2014 в 18:35)   письмо автору
 
   для: confirm   (29.04.2014 в 18:32)
 

Нет это не аватары, а прозрачная картинка по умолчанию на случай если не залита нужная, кстати да размер фиксированный там 50 ширина

  Ответить  
 
 автор: confirm   (29.04.2014 в 18:41)   письмо автору
 
   для: tcfreestyle   (29.04.2014 в 18:35)
 

> прозрачная картинка по умолчанию

И для чего эта картинка? Для наложения как логотип? Хотел бы я посмотреть логотип с ограниченной палитрой наложенный на полноцветные изображения. Ну помилуйте, это же глупость, если только логотип не Черный квадрат Малевича.

Если ширина исходного не слишком отличается от большого, то лучше стилями.
Да и вообще, если изображения типа "для галереи", то простым списком без всяких скриптов можно сделать неплохую галерею.
Если же нечто иное, то лучше добавить в код загрузки изображений сохранение малых их копий.

  Ответить  
 
 автор: tcfreestyle   (29.04.2014 в 18:46)   письмо автору
 
   для: confirm   (29.04.2014 в 18:41)
 

Спасибо за совет

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования