За последние 24 часа нас посетили 22819 программистов и 1519 роботов. Сейчас ищет 1701 программист ...

Некорректно работает функция..

Тема в разделе "Обработка изображений средствами PHP", создана пользователем Great_DUKE, 1 авг 2016.

  1. Great_DUKE

    Great_DUKE Новичок

    С нами с:
    2 ноя 2015
    Сообщения:
    106
    Симпатии:
    0
    Здравствуйте! Для изменения размеров изображения пользуюсь данной функцией
    PHP:
    1. function SetImgSize($img, $width, $height, $AspectRatio, $filePut)
    2. {
    3.  
    4. $nameQ = substr($img, -3, 3);
    5.  
    6. switch ($nameQ){
    7. case "jpg":
    8.     $srcImage = @ImageCreateFromJPEG($img);
    9.     break;
    10. case "gif":
    11.     $srcImage = @ImageCreateFromGIF($img);
    12.     break;
    13. case "png":
    14.     $srcImage = @ImageCreateFromPNG($img);
    15.     break;
    16. default:
    17.     return -1;
    18. }
    19.  
    20. $srcWidth = ImageSX($srcImage);
    21. $srcHeight = ImageSY($srcImage);
    22. if(($width < $srcWidth) || ($height > $srcHeight))
    23. {   if($AspectRatio){
    24.     $ratioWidth = $srcWidth/$width;
    25.     $ratioHeight = $srcHeight/$height;
    26.     if($ratioWidth < $ratioHeight)
    27.        {
    28.     $destWidth = intval($srcWidth/$ratioHeight);
    29.     $destHeight = $height;
    30.        }
    31.     else
    32.        {
    33.     $destWidth = $width;
    34.     $destHeight = intval($srcHeight/$ratioWidth);
    35.        }
    36.     }else {
    37.     $destHeight = $height;
    38.     $destWidth = $width;}
    39.     $resImage = ImageCreateTrueColor($destWidth, $destHeight);
    40.    
    41.     if($nameQ == "png"){
    42.       $white = imagecolorallocate($resImage, 255, 255, 255);
    43.      imagefill($resImage, 0, 0, $white);
    44.     }else{
    45.         $white = "";
    46.     }
    47.    
    48.     ImageCopyResampled($resImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
    49.     switch ( $nameQ ){
    50.     case "jpg":
    51.         ImageJPEG($resImage, $filePut, 90);// 100 - максимальное качество
    52.         break;
    53.     case "gif":
    54.         ImageGIF($resImage, $filePut);
    55.         break;
    56.     case "png":
    57.         ImageJPEG($resImage, $filePut, 90);
    58.         break;
    59.     }
    60.     ImageDestroy($srcImage);
    61.     ImageDestroy($resImage);
    62. }
    63. }
    Работает хорошо, за исключение того, что в ней есть один баг, ну или недоработка.
    Пользуюсь данной функцией в цикле, аргумент $img может принимать и jpg изображения и png и gif.
    Если скажем так, изменить размер только одного изображения и формата png (ну или jpg, gif), то все работает корректно, но а если изменить размер jpg изображения, а потом png, то png изображение не сохранится, а все последующие изображения НЕ формата png - сохранятся. В чем проблема, не могу понять.
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Great_DUKE, не дави ошибки, может узнаешь в чем дело?
    Отладку как делаешь:?
    --- Добавлено ---
    вероятнее всего ошибка во втором switch
     
  3. Great_DUKE

    Great_DUKE Новичок

    С нами с:
    2 ноя 2015
    Сообщения:
    106
    Симпатии:
    0
    Забавно, но нет. Даже если на месте функции будет
    PHP:
    1. ImagePNG($resImages, $filePut)
    , то этот баг будет все равно появляться.
    ImageJPEG я сделал просто для теста.
     
  4. Silver Soft

    Silver Soft Активный пользователь

    С нами с:
    5 авг 2011
    Сообщения:
    17
    Симпатии:
    1
    я думаю, понятно

    не 90, а 9