Програмне створення стиля зображень в Drupal 7


Всього голосів: 1014

Сьогодні я вирішив розповісти як програмно створити стиль зображення, а також як додати ефекти до стилів які йдуть по замовчуванню в Drupal. Також всі редагування можна зробити через адмінку /admin/config/media/image-styles.

Для першого прикладу нам знадобиться хук hook_image_default_styles.


В ньому ми змаштабуємо зображення до розмірів 350х280:

  1. <?php
  2. /**
  3.  * Implements hook_image_default_styles().
  4.  */
  5. function my_module_image_default_styles() {
  6. $styles = array();
  7.  
  8. $styles['custom_style'] = array(
  9. 'label' => 'Custom style (350x280)',
  10. 'effects' => array(
  11. 'name' => 'image_scale',
  12. 'data' => array(
  13. 'width' => 350,
  14. 'height' => 280,
  15. 'upscale' => 1 // Якщо встановлено 1, то зображення яке є меншим за вказані розміри буде збільшене
  16. ),
  17. 'weight' => 0,
  18. ),
  19. ),
  20. );
  21.  
  22. return $styles;
  23. }

Результат:


Обріжемо зображення до відповідного розміру 320х250 і знебарвимо його:

  1. <?php
  2. function my_module_image_default_styles() {
  3. $styles = array();
  4.  
  5. $styles['сrop_style'] = array(
  6. 'label' => 'Crop style (320x250)',
  7. 'effects' => array(
  8. 'name' => 'image_crop',
  9. 'data' => array(
  10. 'width' => 320,
  11. 'height' => 250,
  12. ),
  13. 'weight' => 0,
  14. ),
  15. 'name' => 'image_desaturate',
  16. 'data' => array(),
  17. 'weight' => 1,
  18. ),
  19. ),
  20. );
  21.  
  22. return $styles;
  23. }

Результат:


Тепер змінимо розмір і перевернемо зображення на 90 градусів:

  1. <?php
  2. function my_module_image_default_styles() {
  3. $styles = array();
  4.  
  5. $styles['resize_style'] = array(
  6. 'label' => 'Resize style (600x300)',
  7. 'effects' => array(
  8. 'name' => 'image_resize',
  9. 'data' => array(
  10. 'width' => 600,
  11. 'height' => 300,
  12. ),
  13. 'weight' => 0,
  14. ),
  15. 'name' => 'image_rotate',
  16. 'data' => array(
  17. 'degrees' => 90,
  18. ),
  19. 'weight' => 1,
  20. ),
  21. ),
  22. );
  23.  
  24. return $styles;
  25. }

Результат:


І на останок масштабуємо і обріжемо (такий варіант є найбільш оптимальним оскільки зображення не будуть розтягуватись і збережуть нормальні співвідношення сторін):

  1. <?php
  2. function my_module_image_default_styles() {
  3. $styles = array();
  4.  
  5. $styles['scale_and_crop_style'] = array(
  6. 'label' => 'Scale and crop style (600x300)',
  7. 'effects' => array(
  8. 'name' => 'image_scale_and_crop',
  9. 'data' => array(
  10. 'width' => 600,
  11. 'height' => 300,
  12. ),
  13. 'weight' => 0,
  14. ),
  15. ),
  16. );
  17.  
  18. return $styles;
  19. }

Результат:


Машинна назваОпис ефекту
image_scaleмасштабувати зображення
image_cropобрізати зображення до відповідного розміру
image_rotateобернути зображення
image_desaturateзнебарвити зображення
image_scale_and_cropмасштабувати і обрізати
image_resizeзмінити розмір зображення

Оригінал зображень взятий з модуля Image, переглянути можна тут.

Якщо ж ви не хочете писати свій модуль, а користуєтесь, наприклад, Devel'ом в якому можна просто виконати код. Або вам потрібно перезаписати ефекти стандартних стилів, таких як Large (480x480), Medium (220x220), Thumbnail (100x100) то для цього вам потрібно в файлі my_module.install використовуючи hook_install() написати код:

  1. // Set effect image on default image style
  2. $style_image['m'] = image_style_save(array(
  3. 'name' => 'medium',
  4. 'label' => 'Medium (220x220)',
  5. ));
  6. $effects['medium'] = array(
  7. 'name' => 'image_scale_and_crop',
  8. 'label' => t('Image scale and crop'),
  9. 'data' => array(
  10. 'width' => 220,
  11. 'height' => 220,
  12. ),
  13. 'weight' => 0,
  14. 'effect callback' => 'image_scale_and_crop_effect',
  15. 'isid' => $style_image['m']['isid'],
  16. );
  17. $style_image['l'] = image_style_save(array(
  18. 'name' => 'large',
  19. 'label' => 'Large (480x480)',
  20. ));
  21. $effects['large'] = array(
  22. 'name' => 'image_scale_and_crop',
  23. 'label' => t('Image scale and crop'),
  24. 'data' => array(
  25. 'width' => 480,
  26. 'height' => 480,
  27. ),
  28. 'weight' => 0,
  29. 'effect callback' => 'image_scale_and_crop_effect',
  30. 'isid' => $style_image['l']['isid'],
  31. );
  32.  
  33. foreach ($effects as $effect) {
  34. image_effect_save($effect);
  35. }

Цей код переписує ефекти за промовчуванням для стилів Large і Medium. Для того щоб створити свої стилі потрібно змінити масив в функції image_style_save().

Як видалити програмно стиль зображення:

  1. image_style_delete(image_style_load('image_style')); // image_style - це машинне ім’я стилю