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

Форум PHP

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

 

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

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

тема: imagecopyresized - черный рисунок
 
 автор: darkozoid   (04.09.2012 в 21:40)   письмо автору
 
 

Помогите пожалуйста
надо уменьшить изображение... все вроде работает, вот только результат - черный квадрат... НО с нужными размерами
// resize go
function resize($image_path, $image_small_path, $image_width)
{
    ### размер фотки
    $name=$image_path;
    $maxx=$image_width;
    #узнаем разрешение и размер подложки
    $olds=getimagesize($name);    
    # $olds[0] - ширена картинки 
    $razr=strstr($name,'.');
        if($olds[0]>$maxx)
        {
        $q=$olds[0]/$olds[1];
        $xo=$olds[0];
        $yo=$olds[1];
        $xn=$maxx;
        $yn=round($maxx/$q);
        }
        else
        {
        $xo=$olds[0];
        $yo=$olds[1];
        $xn=$xo;
        $yn=$yo;
        }
        if($type==".jpeg"||".jpg"||".JPEG"||".JPG")
        {
        //Content type
        @header('Content-type: image/jpeg');
        // Load
        $nim = imagecreatetruecolor($xn, $yn);
        $sis = imagecreatefromjpeg($name))
                
        // Resize
        imagecopyresized($nim, $sis, 0, 0, 0, 0, $xn, $yn, $xo, $yo);
        // Output
        imagejpeg($nim, $image_small_path, 100);
        imagedestroy($nim);
            
}    
// resize end
resize("1.jpg", "./dir/", "300");

  Ответить  
 
 автор: confirm   (04.09.2012 в 21:57)   письмо автору
 
   для: darkozoid   (04.09.2012 в 21:40)
 

getimagesize() уже возвращает вам тип изображения, так что $razr=strstr($name,'.'); и if($type==".jpeg"||".jpg"||".JPEG"||".JPG") выбросите (тем более, что можно было бы перевести строку в любой регистр, чтобы не проверять каждый из них), и просто проверьте число. Вопрос только, откуда вы берете эти изображения - если изменяете размер загруженного файла, то почему разрешаете тогда загрузку не нужных вам типов, чтобы после проверять?
Вместо вывода изображения, выведите те размеры, которые вы получили своей арифметикой, будет видна проблема.
И высвобождать надо оба ресурса, а не только $nim.

  Ответить  
 
 автор: darkozoid   (05.03.2014 в 15:07)   письмо автору
 
   для: darkozoid   (04.09.2012 в 21:40)
 

Я честно говоря уже не помню что я тогда делал, но это был мой первый опыт, после этого я дорабатывал функцию. теперь она нормально работает

    // resize go 
    
    function resize($new_image_name, $image_small_path, $image_width){ 
        ### размер фотки 
        $name=$new_image_name; 
        $maxx=$image_width; 
        #узнаем разрешение и размер подложки 
        $olds=getimagesize($_FILES['add']['tmp_name']['img']);     
        # $olds[0] - ширена картинки  
        //Content type 
        if($olds[0]>$maxx){ 
      $q=$olds[0]/$olds[1]; 
      $xo=$olds[0]; 
      $yo=$olds[1]; 
      $xn=$maxx; 
      $yn=round($maxx/$q); 
    }else{ 
      $xo=$olds[0]; 
      $yo=$olds[1]; 
      $xn=$xo; 
      $yn=$yo; 
    } 
        header('Content-type: '.$olds['mime']); 
        // Load 
        $nim = imagecreatetruecolor($xn, $yn); 
        switch($olds['mime']){
            case 'image/jpeg' : $sis = imagecreatefromjpeg($image_small_path.'/'.$name); break; 
            case 'image/png' : $sis = imagecreatefrompng($image_small_path.'/'.$name); break; 
            case 'image/gif' : $sis = imagecreatefromgif($image_small_path.'/'.$name); break; 
        }
        // Resize 
        imagecopyresized($nim, $sis, 0, 0, 0, 0, $xn, $yn, $xo, $yo); 
        // Output 
        switch($olds['mime']){
            case 'image/jpeg' : imagejpeg($nim, $image_small_path.'/'.$name, 100); break;
            case 'image/png' : imagepng($nim, $image_small_path.'/'.$name); break;
            case 'image/gif' : imagegif($nim, $image_small_path.'/'.$name); break;
        }
        imagedestroy($nim);                      
        imagedestroy($sis);                      
    }   
     
    // resize end 

  Ответить  
 
 автор: confirm   (05.03.2014 в 18:48)   письмо автору
 
   для: darkozoid   (05.03.2014 в 15:07)
 

function resize($new_image_name, $image_small_path, $image_width){
### размер фотки
$name=$new_image_name;
$maxx=$image_width;

И зачем это дублирование?
imagecopyresized для image/gif пойдет, для truecolor не совсем.
Сохранение с качеством 100, это вбухать полный размер на диск.

  Ответить  
 
 автор: darkozoid   (25.03.2014 в 16:35)   письмо автору
 
   для: confirm   (05.03.2014 в 18:48)
 

>function resize($new_image_name, $image_small_path, $image_width){
> ### размер фотки
> $name=$new_image_name;
> $maxx=$image_width;
>
>И зачем это дублирование?

да это после вставки функции из исходника в скрипт осталось, я у себя потом это исправил, а тут осталось, на работе то не сказывается...

>imagecopyresized для image/gif пойдет, для truecolor не совсем.
а что лучше? imagecopyresampled?

>Сохранение с качеством 100, это вбухать полный размер на диск.
а с меньшим качеством картинка плохая....

  Ответить  
 
 автор: confirm   (25.03.2014 в 17:04)   письмо автору
 
   для: darkozoid   (25.03.2014 в 16:35)
 

Лучший результат для truecolor конечно дает imagecopyresampled() - полноцветные изображения и изображения основанные на палитре, это кардинально разные изображения. А вот "а с меньшим качеством картинка плохая", это не оправдание, чтобы гнать клиенту лишние килобайты. Даже указав качество 90%, можно значительно сократить размер файла.

И вообще о качестве. На хостат доступна уже версия РНР 5.5, а если не доступна на вашем, добивайтесь пусть устанавливают, или валите с этого хоста на другой, чего у лентяев ошиваться.
В версиях 5.5.Х доступны новые функции GD:

imagescale - изменение размеров изображения.

<?
$im 
imagecreatefromjpeg("img.jpg");
//уменьшаем
$im imagescale($imimagesx($im)/2imagesy($im)/2IMG_BICUBIC_FIXED IMG_BILINEAR_FIXED);
//увеличиваем
$im imagescale($imimagesx($im)*2imagesy($im)*2IMG_BICUBIC_FIXED IMG_BILINEAR_FIXED);


Третьим аргументом функции является метод интерполяции применяемый (применяемых) в операции. Метод интерполяции можно задать ресурсу и функцией imagesetinterpolation(resource, method);

Это доступные методы интерполяции и фильтры (описано кратко, более подробно о них ищите в сети):

IMG_BELL - фильтр Белла (полосовой фильтр с колоколообразной характеристикой)
IMG_BESSEL - фильтр Бесселя (линейный фильтр, спектр на выходе фильтра в полосе пропускания сохраняется практически неизменным)
IMG_BICUBIC - бикубическая (последовательная кубическая интерполяция)
IMG_BICUBIC_FIXED - бикубическая с фиксированной точкой (единожды найденные коэффициенты используются для многократного вычисления интерполированного значения функции в произвольных точках квадрата)
IMG_BILINEAR_FIXED - билинейная (интерполяция методом ближайшего соседа) с фиксированной точкой (по умолчанию применяется к созданному новому ресурсу)
IMG_BLACKMAN - функция Блэкмана, определяет количество и ширину перехода, которая происходит во время фильтрации (муар, резкость)
IMG_BOX - кубическое размытие
IMG_BSPLINE - сплайн-интерполяция
IMG_CATMULLROM - фильтр подчеркивающий края (увеличение резкости)
IMG_GAUSSIAN - фильтр Гаусса (сглаживание, размытие)
IMG_GENERALIZED_CUBIC - обобщенный кубический сплайн, фрактальная интерполяция
IMG_HERMITE - интерполяция Эрмита (смешивание)
IMG_HAMMING - фильтр Хэмминга (удаление шумов)
IMG_HANNING - фильтр Хеннинга (удаление шумов)
IMG_MITCHELL - фильтр Митчелла (подчеркивание краев)
IMG_POWER - усиление
IMG_QUADRATIC - обратная квадратичная интерполяция
IMG_SINC - подавление спектра выше частоты среза, на выходе низкочастотная полоса спектра
IMG_NEAREST_NEIGHBOUR - интерполяция методом ближайшего соседа
IMG_WEIGHTED4 - весоизмерительный фильтр
IMG_TRIANGLE - треугольная интерполяция

Указанные методы применимы для всех функций, которые преобразуют изображение.

  Ответить  
 
 автор: darkozoid   (26.03.2014 в 08:51)   письмо автору
 
   для: confirm   (25.03.2014 в 17:04)
 

Спасибо большое, теперь буду знать

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

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