Постановка задачи: есть несколько тысяч картинок-миниатюр с прямыми углами. Необходимо преобразовать их таким образом, чтобы углы были закруглёнными.

Кто-то будет писать PHP-скрипт, кто-то — использовать PhotoShop, а для любителей командной строки и ImageMagick есть более простое решение.

Итак, пусть у нас имеется такое исходное изображение (размер изображения — 96×96, но для описываемого метода это не важно):

Для начала нам надо рассчитать параметры рамки:

[-]
View Code Bash
convert source.png -border 2 -format 'roundrectangle 1,1 %[fx:w-2],%[fx:h-2] %[fx:int((w+h)/15)],%[fx:int((w+h)/15)]' info: > rounded-corners.mvg

Высота и ширина берутся непосредственно из файла, а результаты вычислений сохраняются в файле формата Magick Vector Graphics и будут использоваться далее. Перед проведением вычислений к файлу добавляется двухпиксельная рамка. Таким образом, размер изображения с рамкой (концы которой будут закругляться) составит 100×100.

Теперь нам нужно сгенерировать оверлей и маску:

[-]
View Code Bash
convert source.png -border 2 -matte -channel RGBA -threshold -1 -background none -fill none -stroke black -strokewidth 3 -draw "@rounded-corners.mvg" overlay.png
convert source.png -border 2 -matte -channel RGBA -threshold -1 -background none -fill white -stroke black -strokewidth 1 -draw "@rounded_corner.mvg" mask.png

Оверлей представляет собой рамку с закругленными концами, которая будет накладываться на исходное изображение. Маска же используется для стирания лишних частей изображения. Ширина штриха маски меньше ширины штриха оверлея: хотя будет стёрто чуть большее по площади изображение, края изображения будут сглажены должным образом. Цвет рамки задаётся в параметре stroke.

Для изображений одного размера оверлей и маска будут одинаковыми. Поэтому при обработке большого количества изображений есть смысл генерировать их один раз.

Формируем окончательное изображение:

[-]
View Code Bash
convert source.png -matte -bordercolor none -border 2 mask.png -compose DstIn -composite overlay.png -compose Over -composite -depth 8 -quality 95 dest.png

Получим следующее изображение:

Над изображением можно извратиться и получить более красивую рамку:

[-]
View Code Bash
convert target.png -matte -virtual-pixel transparent -channel A -blur 0x8 -evaluate subtract 50% -evaluate multiply 2.001 soft-edge.png

Получим такое изображение:

Есть еще один способ закругления углов (в этом случае ни маска, ни оверлей не нужны):

[-]
View Code Bash
convert source.png -matte -virtual-pixel transparent -channel A -blur 0x8 -evaluate subtract 50% -evaluate multiply 2.001 soft-edge.png

Как обработать коллекцию файлов? В Linux это просто: я приведу общий случай:

[-]
View Code Bash
find . -type f -name "*.png" -exec convert "{}" -matte -bordercolor none -border 2 /path/to/mask.png -compose DstIn -composite /path/to/overlay.png -compose Over -composite -depth 8 -quality 95 -matte -virtual-pixel transparent -channel A -blur 0x8 -evaluate subtract 50% -evaluate multiply 2.001 "{}" \;

PS — а еще можно и тень добавить:

[-]
View Code Bash
convert -page +4+4 soft-edge.png \( +clone -background gray -shadow 60x4+4+4 \) +swap -background none -mosaic -depth 8 -quality 95 shadowed.png
Добавить в закладки
  • del.ici.ous
  • Digg
  • Furl
  • Google
  • Simpy
  • Spurl
  • Y! MyWeb
  • БобрДобр
  • Мистер Вонг
  • Yandex.Закладки
  • Текст 2.0
  • News2
  • AddScoop
  • RuSpace
  • RUmarkz
  • Memori
  • Google Bookmarks
  • Писали
  • СМИ 2
  • Моё Место
  • 100 Закладок
  • Ваау!
  • Technorati
  • RuCity
  • LinkStore
  • NewsLand
  • Lopas
  • Закладки - IN.UA
  • Connotea
  • Bibsonomy
  • Trucking Bookmarks
  • Communizm
  • UCA
  • Slashdot
  • Magnolia
  • Blogmarks
  • Current
  • Meneame
  • Oknotizie
  • Diigo
  • Funp
  • Hugg
  • Dealspl.us
  • N4G
  • Mister Wong
  • Faves
  • Yigg
  • Fresqui
  • Care2
  • Kirtsy
  • Sphinn

Связанные записи

12
Янв
2009

Комментарии к статье «Закруглённые углы при помощи ImageMagick» (2)  »

  1. Макисим Покровский says:

    Я правильно понял что это пакетная обработка изображений, а не изменение картинки (скажем при аплоаде) на картинку с закругленными углами?

    • Vladimir says:

      Всё относительно :-) Описанную процедуру можно применять и при аплоаде.

      В одном из проектов я использовал этот метод для генерации миниатюр при аплоаде:

      [-]
      View Code PHP
      function uploadImage($src, $id, $dims, &$error)
      {
          global $smarty;
          $mask    = IMAGES_DIR . '/' . $smarty->skin . '/photos/mask.png';
          $overlay = IMAGES_DIR . '/' . $smarty->skin . '/photos/overlay.png';

          $options = "\"{$src}\"" . ' -compress JPEG ';
          $error   = '';
          $output  = array();
          $retval  = 0;
          $hash    = $this->getHash($id);

          if (false == empty($dims) && 0 != $dims[0]) {
              $options .= " -resize \"{$dims[0]}x{$dims[0]}\" ";
          }

          $path     = $this->makeDirs(PHOTOS_DIR . '/full', $hash);
          $dst      = $path . '/' . $id . '.jpg';
          $options .= ' ' . $dst;

          exec(IMAGE_MAGICK_CONVERT . ' ' . $options, $output, $retval);
          if (0 != $retval) {
              $error = "Error ({$retval}): " . join(' ', $output) . " ({$dst})";
              return false;
          }

          $converted = array($dst);
          $failed    = false;

          if (count($dims) > 1) {
              for ($i=1; $i<count($dims); ++$i) {
                  $options  = "\"{$src}\"" . " -thumbnail \"{$dims[$i]}x{$dims[$i]}\" -quality 90 ";

                  $path     = $this->makeDirs(PHOTOS_DIR . "/{$dims[$i]}x{$dims[$i]}", $hash);
                  $dst      = $path . '/' . $id . '.jpg';
                  $size     = $dims[$i];
      //===========================================
                  $options .= " -size {$size}x{$size} xc:#999999 +swap " .
                              "-gravity center -composite -matte -bordercolor none " .
                              "-border 2 {$mask} -compose DstIn -composite {$overlay} " .
                              "-compose Over -composite -depth 8 -quality 95 -matte " .
                              "-virtual-pixel transparent -channel A -blur 0x8 " .
                              "-evaluate subtract 50% -evaluate multiply 2.001 " . $dst;

                  exec(IMAGE_MAGICK_CONVERT . ' ' . $options, $output, $retval);
      //===========================================
                  if (0 != $retval) {
                      $error  = "Error ({$retval}): " . join(' ', $output) . " ({$dst})";
                      $failed = true;
                      break;
                  }

                  $converted[] = $dst;
                  chmod($dst, 0666);
              }
          }

          if (true == $failed) {
              foreach ($converted as $file) {
                  @unlink($file);
              }

              return false;
          }

          return true;
      }

Подписаться на RSS-ленту комментариев к статье «Закруглённые углы при помощи ImageMagick» Trackback URL: http://blog.sjinks.org.ua/imagemagick/476-rounded-corners-with-imagemagick/trackback/

Оставить комментарий к записи «Закруглённые углы при помощи ImageMagick»

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, Вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя