Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Скрипт генерации миниатюры с сохранением пропорции
Форумы портала PHP.SU » » Графика в PHP » Скрипт генерации миниатюры с сохранением пропорции

Страниц (1): [1]
 

1. Invert - 13 Декабря, 2013 - 14:14:01 - перейти к сообщению
Оставлю его здесь, а то с годами, возможно, потеряется.
Возможно кому-то будет полезен.

Скрипт создания миниатюр с центровкой и сохранением пропорции (отношением сторон).

Скриншот:


PHP:
скопировать код в буфер обмена
  1.  
  2. function create_image ( $filepath ) {
  3.     if ( is_file( $filepath ) && is_readable( $filepath ) ) {
  4.         $imagedata = getimagesize( $filepath );
  5.         if ( $imagedata && isset( $imagedata[ 'mime' ] ) ) {
  6.             $mime = array_pop(
  7.                 explode( '/', $imagedata[ 'mime' ] )
  8.             );
  9.         } else {
  10.             $mime = 'jpeg';
  11.         }
  12.         switch ( strtolower( $mime ) ) {
  13.             case 'jpg':
  14.             case 'jpe':
  15.             case 'jpeg':
  16.                 return imagecreatefromjpeg( $filepath );
  17.             case 'png':
  18.                 return imagecreatefrompng( $filepath );
  19.             case 'gif':
  20.                 return imagecreatefromgif( $filepath );
  21.             case 'wbmp':
  22.                 return imagecreatefromwbmp( $filepath );
  23.         }
  24.     }
  25.     return FALSE;
  26. }
  27.  
  28. function create_preview_image ( $original_path, $thumbnail_path, $x_thumbnail, $y_thumbnail ) {
  29.     $result = FALSE;
  30.     if ( is_file( $original_path ) && $image_original = create_image( $original_path ) ) {
  31.         // Получаем размеры оригинала
  32.         $x_original = imagesx( $image_original );
  33.         $y_original = imagesy( $image_original );
  34.         // Создаем миниатюру
  35.         $image_thumbnail = imagecreatetruecolor( $x_thumbnail, $y_thumbnail );
  36.         // Вычисляем размер по ширине
  37.         $x_original_new = (integer) ( $x_thumbnail * ( $y_original / $y_thumbnail ) );
  38.         // Проверяем, не вышли ли за пределы изображения
  39.         if ( $x_original_new > $x_original ) {
  40.             // Вышли. Тогда вычисляем размер по высоте
  41.             $y_original_new = (integer) ( $y_original * ( $x_original / $x_original_new ) );
  42.             $x_original_new = $x_original;
  43.         } else {
  44.             $y_original_new = $y_original;
  45.         }
  46.         // Вычисляем срезы сторон
  47.         $x_indent = $x_original_new - $x_original;
  48.         $y_indent = $y_original_new - $y_original;
  49.         // Вычисляем смещение
  50.         $x_original_offset = ( $x_indent !== 0 ) ? -(integer) ( $x_indent / 2 ) : 0;
  51.         $y_original_offset = ( $y_indent !== 0 ) ? -(integer) ( $y_indent / 2 ) : 0;
  52.  
  53.         echo <<<HTML
  54.             <!-- Отладка, вывод данных и миниатюры -->
  55.             <span style="display: inline-block; float: left; border: 1px solid #eee; margin: 5px; padding: 5px;">
  56.  
  57.                 Thumbnail: {$x_thumbnail} x {$y_thumbnail}<br />
  58.                 Original: {$x_original} x {$y_original}                Cropped: {$x_original_new} x {$y_original_new}<br />
  59.                 Indent: {$x_indent} x {$y_indent}                Offset: {$x_original_offset} x {$y_original_offset}<br />
  60.                 <img src="/___/{$thumbnail_path}" />
  61.             </span>
  62. HTML;
  63.  
  64.  
  65.         // Копируем изображение в миниатюру
  66.         imagecopyresampled( $image_thumbnail, $image_original, 0, 0, $x_original_offset, $y_original_offset, $x_thumbnail, $y_thumbnail, $x_original_new, $y_original_new );
  67.  
  68.         if ( imagejpeg( $image_thumbnail, $thumbnail_path, 100 ) ) {
  69.             $result = TRUE;
  70.         }
  71.         imagedestroy( $image_original );
  72.         imagedestroy( $image_thumbnail );
  73.     }
  74.     return $result;
  75. }
  76.  


PHP:
скопировать код в буфер обмена
  1.  
  2. $image_0 = '0.jpeg';
  3. $thumb_0 = '_' . $image_0;
  4.  
  5. $x_0 = 420;
  6. $y_0 = 146;
  7. $x_1 = 220;
  8. $y_1 = 146;
  9. $x_2 = 146;
  10. $y_2 = 146;
  11.  
  12. create_preview_image( $image_0, 1 . $thumb_0, $x_0, $y_0 );
  13. create_preview_image( $image_0, 3 . $thumb_0, $x_1, $y_1 );
  14. create_preview_image( $image_0, 5 . $thumb_0, $x_2, $y_2 );
  15. create_preview_image( $image_0, 4 . $thumb_0, $y_1, $x_1 );
  16. create_preview_image( $image_0, 2 . $thumb_0, $y_0, $x_0 );
2. 3d_killer - 13 Декабря, 2013 - 15:21:30 - перейти к сообщению
тут Panoptik вроде выкладывал свой скрипт (только тут он чуть измененный)
PHP:
скопировать код в буфер обмена
  1.  
  2. function cutImage($source,$required_width,$required_height,$output,$valign = 'center',$halign = 'center') {
  3.             list($original_width, $original_height, $imageType) = getimagesize($source);
  4.             $imageType = image_type_to_mime_type($imageType);
  5.             switch($imageType) {
  6.                 case "image/gif":
  7.                     $src=imagecreatefromgif($source);
  8.                     $type_img = 'gif';
  9.                     break;
  10.                 case "image/pjpeg":
  11.                 case "image/jpeg":
  12.                 case "image/jpg":
  13.                     $src=imagecreatefromjpeg($source);
  14.                     $type_img = 'jpg';
  15.                     break;
  16.                 case "image/png":
  17.                 case "image/x-png":
  18.                     $src=imagecreatefrompng($source);
  19.                     $type_img = 'png';
  20.                     break;
  21.             }
  22.                     //соотношение сторон оригинала
  23.                     $original_ratio = $original_height/$original_width;
  24.                     //соотношение сторон необходимое
  25.                     $required_ratio = $required_height/$required_width;
  26.                    
  27.                     if($original_ratio > $required_ratio) {
  28.                             $resized_ratio = $original_width/$required_width;
  29.                             $new_width = $required_width;
  30.                             $new_height = $original_height/$resized_ratio;
  31.                             $src_x = 0;
  32.                             if($valign == 'center') {
  33.                                     $src_y = ($new_height-$required_height)/2;
  34.                             } elseif($valign == 'top') {
  35.                                     $src_y = 0;
  36.                             } else {
  37.                                     $src_y = $new_height-$required_height;
  38.                             }
  39.                     } else {
  40.                             $resized_ratio = $original_height/$required_height;
  41.                             $new_height = $required_height;
  42.                             $new_width = $original_width/$resized_ratio;
  43.                             if($halign == 'center') {
  44.                                     $src_x = ($new_width-$required_width)/2;
  45.                             } elseif($halign == 'left') {
  46.                                     $src_x = 0;
  47.                             } else {
  48.                                     $src_x = $new_width-$required_width;
  49.                             }
  50.                             $src_y = 0;
  51.                     }
  52.                    
  53.                     $resized_src = imagecreatetruecolor ($new_width, $new_height);
  54.                                         imagealphablending($resized_src, false);
  55.                                         imagesavealpha($resized_src, true);
  56.                     imagecopyresampled($resized_src, $src, 0, 0, 0, 0, $new_width, $new_height, $original_width, $original_height);
  57.                    
  58.                     $dst = imagecreatetruecolor($required_width, $required_height);
  59.                         imagealphablending($dst , false);
  60.                                         imagesavealpha($dst , true);
  61.             if($type_img == 'png'){
  62.                 $transparent = imagecolorallocatealpha($dst, 0, 0, 0, 127);
  63.                 imagefill($dst, 0, 0, $transparent);
  64.                 imagesavealpha($dst, true);
  65.             }
  66.                     imagecopyresampled($dst, $resized_src, 0, 0, $src_x, $src_y, $required_width, $required_height, $required_width, $required_height);
  67.             switch($imageType) {
  68.                 case "image/gif":
  69.                     imagegif($dst, $output);  
  70.                     break;
  71.                 case "image/png":
  72.                 case "image/x-png":
  73.                     imagepng($dst, $output);  
  74.                     break;
  75.                 default:
  76.                     imagejpeg($dst, $output);
  77.             }
  78.            
  79.         }
  80.  

(Добавление)
и ваш скрипт не работает с прозрачными png gif, проверьте что получится
3. Invert - 13 Декабря, 2013 - 15:50:15 - перейти к сообщению
На сайте, для которого писался скрипт, отключена возможность загрузки GIF-ок, да и прозрачные PNG там не используются.


(Добавление)

Обновленный, с учетом прозрачности.
Проверено на GIF и PNG.



PHP:
скопировать код в буфер обмена
  1.  
  2. function create_preview_image ( $original_path, $thumbnail_path, $x_thumbnail, $y_thumbnail ) {
  3.     $result = FALSE;
  4.     if ( is_file( $original_path ) && is_readable( $original_path )  ) {
  5.         // Определяем тип изображения
  6.         $image_data = getimagesize( $original_path );
  7.         if ( $image_data && isset( $image_data[ 'mime' ] ) ) {
  8.             $mime = strtolower(
  9.                 array_pop(
  10.                     explode( '/', $image_data[ 'mime' ] )
  11.                 )
  12.             );
  13.         } else {
  14.             $mime = 'jpeg';
  15.         }
  16.         // Открываем изображение
  17.         switch ( $mime ) {
  18.             case 'jpg':
  19.             case 'jpe':
  20.             case 'jpeg':
  21.                 $image_original = imagecreatefromjpeg( $original_path );
  22.                 break;
  23.             case 'png':
  24.                 $image_original = imagecreatefrompng( $original_path );
  25.                 break;
  26.             case 'gif':
  27.                 $image_original = imagecreatefromgif( $original_path );
  28.                 break;
  29.             case 'wbmp':
  30.                 $image_original = imagecreatefromwbmp( $original_path );
  31.                 break;
  32.             default:
  33.                 return FALSE;
  34.         }
  35.         // Получаем размеры оригинала
  36.         list( $x_original, $y_original ) = $image_data;
  37.         // Создаем миниатюру
  38.         $image_thumbnail = imagecreatetruecolor( $x_thumbnail, $y_thumbnail );
  39.         if ( $mime == 'png' ) {
  40.             // Сохраняем альфа-канал
  41.             imagealphablending( $image_thumbnail, FALSE );
  42.             imagesavealpha( $image_thumbnail, TRUE );
  43.         } elseif ( $mime == 'gif'  ) {
  44.             if ( ( $transparent_index_original = imagecolortransparent( $image_original ) ) ) {
  45.                 // Определяем прозрачный цвет и передаем его в миниатюру
  46.                 $transparent_color_original = imagecolorsforindex( $image_original, $transparent_index_original );
  47.                 $transparent_index_thumbnail = imagecolorallocate(
  48.                     $image_thumbnail,
  49.                     $transparent_color_original[ 'red' ],
  50.                     $transparent_color_original[ 'green' ],
  51.                     $transparent_color_original[ 'blue' ]
  52.                 );
  53.                 imagecolortransparent( $image_thumbnail, $transparent_index_thumbnail );
  54.                 imagefill( $image_thumbnail, 0, 0, $transparent_index_thumbnail );
  55.             }
  56.         }
  57.         // Вычисляем размер по ширине
  58.         $x_original_new = (integer) ( $x_thumbnail * ( $y_original / $y_thumbnail ) );
  59.         // Проверяем, не вышли ли за пределы изображения
  60.         if ( $x_original_new > $x_original ) {
  61.             // Вышли. Тогда вычисляем размер по высоте
  62.             $y_original_new = (integer) ( $y_original * ( $x_original / $x_original_new ) );
  63.             $x_original_new = $x_original;
  64.         } else {
  65.             $y_original_new = $y_original;
  66.         }
  67.         // Вычисляем срезы сторон
  68.         $x_indent = $x_original_new - $x_original;
  69.         $y_indent = $y_original_new - $y_original;
  70.         // Вычисляем смещение
  71.         $x_original_offset = ( $x_indent !== 0 ) ? -(integer) ( $x_indent / 2 ) : 0;
  72.         $y_original_offset = ( $y_indent !== 0 ) ? -(integer) ( $y_indent / 2 ) : 0;
  73.  
  74.         echo <<<HTML
  75.             <!-- Отладка, вывод данных и миниатюры -->
  76.             <span style="display: inline-block; float: left; border: 1px solid #eee; margin: 5px; padding: 5px; background: #eee;">
  77.  
  78.                 Thumbnail: {$x_thumbnail} x {$y_thumbnail}<br />
  79.                 Original: {$x_original} x {$y_original}                Cropped: {$x_original_new} x {$y_original_new}<br />
  80.                 Indent: {$x_indent} x {$y_indent}                Offset: {$x_original_offset} x {$y_original_offset}<br />
  81.                 <img src="/___/{$thumbnail_path}" />
  82.             </span>
  83. HTML;
  84.  
  85.         // Копируем изображение в миниатюру
  86.         imagecopyresampled( $image_thumbnail, $image_original, 0, 0, $x_original_offset, $y_original_offset, $x_thumbnail, $y_thumbnail, $x_original_new, $y_original_new );
  87.         // Сохраняем миниатюру
  88.         switch ( $mime ) {
  89.             case 'jpg':
  90.             case 'jpe':
  91.             case 'jpeg':
  92.                 $result = imagejpeg( $image_thumbnail, $thumbnail_path, 100 );
  93.                 break;
  94.             case 'png':
  95.                 $result = imagepng( $image_thumbnail, $thumbnail_path );
  96.                 break;
  97.             case 'gif':
  98.                 $result = imagegif( $image_thumbnail, $thumbnail_path );
  99.                 break;
  100.             case 'wbmp':
  101.                 $result = imagewbmp( $image_thumbnail, $thumbnail_path );
  102.                 break;
  103.         }
  104.         // Очищаем память
  105.         imagedestroy( $image_original );
  106.         imagedestroy( $image_thumbnail );
  107.     }
  108.     return $result;
  109. }
  110.  


PHP:
скопировать код в буфер обмена
  1.  
  2. create_preview_image( 'path/to/original.jpg', 'path/to/new/thumb.jpg', $x_thumb, $y_thumb );
  3.  

 

Powered by ExBB FM 1.0 RC1