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

Форум PHP

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

 

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

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

тема: Почему функция resizeimg() сжимает качество изображения?
 
 автор: Dimka31   (29.01.2009 в 14:24)   письмо автору
 
 

Эта функция из книги Головоломки на PHP для хакеров

<?php
  
function resizeimg($filename, $smallimage, $w, $h) 
  { 
    
// 1. Коррекция параметров $w и $h
    // Определим коэффициент сжатия изображения
    
$ratio = $w / $h; 
    
// Получим размеры исходного изображения 
    
list($width, $height) = getimagesize($filename); 
    
// Если размеры меньше, то масштабирования не нужно 
    
if (($width < $w) && ($height < $h))
    {
      
copy($filename, $smallimage);
      return 
true; 
    }
    
// получим коэффициент сжатия исходного изображения 
    
$src_ratio = $width/ $height; 

    
// Вычисляем размеры уменьшенной копии, чтобы 
    // при масштабировании сохранились 
    // пропорции исходного изображения 
    
if ($ratio < $src_ratio) $h = $w/$src_ratio; 
    else 
$w = $h*$src_ratio; 

    
// 2. Создание уменьшенной копии изображения
    // Создаем пустое изображение 
    // размером $w x $h пикселов
    
$dest_img = imagecreatetruecolor($w, $h);   
    
// Открываем файл, который будет подвергаться сжатию
    
$src_img = imagecreatefromjpeg($filename);                       

    
// Масштабируем изображение
    
imagecopyresampled($dest_img, 
                       
$src_img, 
                       
0, 
                       
0, 
                       
0, 
                       
0, 
                       
$w, 
                       
$h, 
                       
$width, 
                       
$height);
    
// Сохраняем уменьшенную копию в файл 
    
imagejpeg($dest_img, $smallimage);                       
    
// Чистим память от созданных изображений 
    
imagedestroy($dest_img); 
    
imagedestroy($src_img); 
    return 
true;          
  }   
?>


Просмотрел эту всю но так и не нашел параметра контролирующий степень сжатия.
Даже если загружать изображение того же разрешения, что и функция уменьшает, после действия этой функции изображения весит меньше.
Придумал этой функции интересное применение автоматическое создание уменьшанной копии, то есть загружаем одну фотку получаем еще и превью, учень удобно не нужно подготавливать изображения для загрзку, но так как они сжимаются клиенты не давольны.
Есть ли способ решить проблему?
Заранее благодарен!

  Ответить  
 
 автор: sim5   (29.01.2009 в 14:29)   письмо автору
 
   для: Dimka31   (29.01.2009 в 14:24)
 

Здесь причина проблемы, третий параметр функции. По умолчанию 75%.

  Ответить  
 
 автор: Николай2357   (29.01.2009 в 14:58)   письмо автору
 
   для: Dimka31   (29.01.2009 в 14:24)
 

Вот эта лучше функция, для трёх форматов и размер одним аргументом.
<?
function resize($file, $small, $r )  
{
  
$img = getimagesize($file); 
 
    if ((
$img[0] < $r) && ( $img[1] < $r)) 
    return 
true;
    
$w = $h = $r;      
$s = $img[0] / $img[1];  
    if (
$r < $s)  
    
$h = $r / $s;  
    else  
    
$w = $r * $s;  
       
$dest = imagecreatetruecolor($w, $h);    
$white = imagecolorallocate($dest, 255, 255, 255); 
        
    if (
$img[2]==2)  $src = imagecreatefromjpeg($file);                        
    else if (
$img[2]==1) $src = imagecreatefromgif($file);                        
    else if (
$img[2]==3) $src = imagecreatefrompng($file);
       
imagecopyresampled($dest, $src, 0, 0, 0, 0, $w, $h, $img[0], $img[1]);                  
  
    if (
$img[2]==2)  imagejpeg($dest, $small, 90);                        
    else if (
$img[2]==1) imagegif($dest, $small, 90);                        
    else if (
$img[2]==3) imagepng($dest, $small, 90);   

imagedestroy($dest);  
imagedestroy($src);  
    return 
true;           
  } 
 
// Аргументы - Уменьшаемый файл, путь до превью, максимальный размер 
resize("1.jpg", "2.jpg", 50);     
?>

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

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