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

Форум PHP

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

 

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

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

тема: Обесцветить изображение
 
 автор: maximum7   (23.10.2009 в 22:34)   письмо автору
 
 

Добрый день.

Есть функция:


   function imageresize($outfile,$infile,$neww,$newh,$quality) {
   $size = getimagesize($outfile);
   $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));

    $im=imagecreatefromjpeg($infile);
    $im1=imagecreatetruecolor($neww,$newh);
    
$alt_breite = imagesx($im);
$alt_hoehe = imagesy($im);
$neu_breite = $neww;
$neu_hoehe = $newh;
$thumb = imagecreatetruecolor($neu_breite, $neu_breite);

$thumb_id = $file;

//===============================================================
// Формирование квадратной миниатюры
//===============================================================
// вырезаем квадратную серединку, если изображение горизонтальное
if ($alt_breite>$alt_hoehe) {
  imagecopyresized($im1, $im, 0, 0, round((max($alt_breite,$alt_hoehe)-min($alt_breite,$alt_hoehe))/2), 0, $neu_breite, $neu_breite, min($alt_breite,$alt_hoehe), min($alt_breite,$alt_hoehe));
}

// вырезаем квадратную верхушку, если изображение вертикальное
if ($alt_breite<$alt_hoehe) {
  imagecopyresized($im1, $im, 0, 0, 0, 0, $neu_breite, $neu_breite, min($alt_breite,$alt_hoehe), min($alt_breite,$alt_hoehe));
}

// квадратное изображение масштабируется без вырезок
if ($alt_breite==$alt_hoehe) {
  imagecopyresized($im1, $im, 0, 0, 0, 0, $neu_breite, $neu_breite, $alt_breite, $alt_hoehe);
}
    
    
    // Создаем 256-цветную палитру
    for ($c=0;$c<256;$c++)
    {
        $palette[$c] = imagecolorallocate($im1,$c,$c,$c);
    }


        for ($y=0;$y<$newh;$y++)
    {
        for ($x=0;$x<$neww;$x++)
        {
            $rgb = imagecolorat($im1,$x,$y);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;

            //Используем функцию yiq для изменения rgb-палитры нашего цветного изображения, чтобы преобразовать его в серое
            $gs = $this->yiq($r,$g,$b);
            imagesetpixel($im1,$x,$y,$palette[$gs]);
        }
    }
    
    imagejpeg($im1,$outfile,$quality);
    imagedestroy($im);
    imagedestroy($im1);
    }



И есть проблема. При загрузке изображений большого размера происходит их ресайз и обесцвечивание. Но, если изображение загружено изначально нужного размера, оно не обесцвечивается. Как исправить?

  Ответить  
 
 автор: Саня   (23.10.2009 в 22:45)   письмо автору
 
   для: maximum7   (23.10.2009 в 22:34)
 

Надо убрать этот участок кода:
<?
    
// Создаем 256-цветную палитру 
    
for ($c=0;$c<256;$c++) 
    { 
        
$palette[$c] = imagecolorallocate($im1,$c,$c,$c); 
    } 


        for (
$y=0;$y<$newh;$y++) 
    { 
        for (
$x=0;$x<$neww;$x++) 
        { 
            
$rgb imagecolorat($im1,$x,$y); 
            
$r = ($rgb >> 16) & 0xFF
            
$g = ($rgb >> 8) & 0xFF
            
$b $rgb 0xFF

            
//Используем функцию yiq для изменения rgb-палитры нашего цветного изображения, чтобы преобразовать его в серое 
            
$gs $this->yiq($r,$g,$b); 
            
imagesetpixel($im1,$x,$y,$palette[$gs]); 
        } 
    }

  Ответить  
 
 автор: maximum7   (23.10.2009 в 22:57)   письмо автору
 
   для: Саня   (23.10.2009 в 22:45)
 

Мне нужно не только размер изменить, но и обесцветить его

  Ответить  
 
 автор: Саня   (23.10.2009 в 23:23)   письмо автору
 
   для: maximum7   (23.10.2009 в 22:57)
 

Если картинка меньше заданных размеров, то она вообще не копируется в $im1. А именно $im1 подвергается обесцвечиванию. Так что нужно добавить ещё одну проверку, которая сравнивает исходный размер с нужным. И если исходный меньше нужного, то копировать в $im1 без изменения размеров.

  Ответить  
 
 автор: maximum7   (24.10.2009 в 00:47)   письмо автору
 
   для: Саня   (23.10.2009 в 23:23)
 

Как это правильно сделать?

  Ответить  
 
 автор: Саня   (24.10.2009 в 10:38)   письмо автору
 
   для: maximum7   (24.10.2009 в 00:47)
 

Я же написал — проверка размеров и простое копирование.

  Ответить  
 
 автор: maximum7   (24.10.2009 в 18:00)   письмо автору
 
   для: Саня   (24.10.2009 в 10:38)
 

Так:

if ($alt_breite == $neu_hoehe || $alt_hoehe == $neu_breite) {
  imagecopyresampled($im1, $im, 0, 0, 0, 0, $neu_breite, $neu_breite, $alt_breite, $alt_hoehe);

  Ответить  
 
 автор: maximum7   (24.10.2009 в 22:49)   письмо автору
4.4 Кб
 
   для: maximum7   (24.10.2009 в 18:00)
 

Разобрался:


 function resiz ($f,$src,$w,$h,$q) {
// f - имя файла 
// q - качество сжатия 
// src - исходное изображение 
// dest - результирующее изображение 
// w - ширниа изображения 
// ratio - коэффициент пропорциональности 

   $size = getimagesize($f);
   $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
   
// создаём исходное изображение на основе 
// исходного файла и опеределяем его размеры 
   if ($format == 'jpg' || $format == 'jpeg') $im = imagecreatefromjpeg($src); 
   if ($format == 'gif') $im = imagecreatefromgif($src);
   if ($format == 'png') $im = imagecreatefrompng($src);
     
$w_src = imagesx($im); 
$h_src = imagesy($im);

if ($w_src != $w) 
 {

         // создаём пустую квадратную картинку 
         // важно именно truecolor!, иначе будем иметь 8-битный результат 
         $dest = imagecreatetruecolor($w,$w); 

         // вырезаем квадратную серединку по x, если фото горизонтальное 
         if ($w_src>$h_src) 
         imagecopyresized($dest, $im, 0, 0,
                          round((max($w_src,$h_src)-min($w_src,$h_src))/2),
                          0, $w, $w, min($w_src,$h_src), min($w_src,$h_src)); 

         // вырезаем квадратную верхушку по y, 
         // если фото вертикальное (хотя можно тоже серединку) 
         if ($w_src<$h_src) 
         imagecopyresized($dest, $im, 0, 0, 0, 0, $w, $w,
                          min($w_src,$h_src), min($w_src,$h_src)); 

         // квадратная картинка масштабируется без вырезок 
         if ($w_src==$h_src) 
         imagecopyresized($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src); 

        imagefilter($dest, IMAGE_FILTER_NEGATE);
            
 } else {
 
         // создаём пустую квадратную картинку 
         // важно именно truecolor!, иначе будем иметь 8-битный результат 
         $dest = imagecreatetruecolor($w,$w); 
         imagecopyresized($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
         
         imagefilter($dest, IMAGE_FILTER_NEGATE);
         
    }
     // вывод картинки и очистка памяти 
    imagejpeg($dest,$src,$q); 
    imagedestroy($dest); 

}



Но, качество полученных изображений оставляет желать лучшего. Это можно исправить?

  Ответить  
 
 автор: Саня   (24.10.2009 в 23:54)   письмо автору
 
   для: maximum7   (24.10.2009 в 22:49)
 

Вместо imagecopyresized() попробуйте imagecopyresampled().

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

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