Как бы я программно обрезал изображение до непрямоугольной формы? - PullRequest
5 голосов
/ 22 января 2010

Я хочу обрезать прямоугольное изображение в непрямоугольную форму. Я понимаю, что если вы понимаете это буквально, это невозможно. В итоге я хочу получить изображение X, обрезанное по форме Y, на прозрачном фоне.

Скажем, например, что я хочу сфотографировать флаг Айдахо и обрезать его в форме штата Айдахо. Я думаю, я бы сделал что-то вроде этого:

  1. Создание изображения с непрозрачными пикселями для фигуры Айдахо, везде прозрачные пиксели
  2. Прочитайте и сохраните какое-нибудь растровое изображение для этого изображения штата Айдахо
  3. Для каждого непрозрачного местоположения пикселя в изображении состояния штата Айдахо скопируйте соответствующий пиксель из изображения флага состояния штата Айдахо и поместите его на пустой прозрачный холст

Шаг 1, очевидно, будет выполнен вручную, а остальное будет сделано программно. Я думаю, что у меня есть правильная идея в целом, но я не знаю, как бы я подошел к конкретике. Кто-нибудь может указать мне правильное направление?

Что касается технологии реализации, то я парень из PHP, поэтому использование gdLibrary или чего-то, что работает с PHP, вероятно, будет лучшим способом для меня.

Ответы [ 3 ]

2 голосов
/ 22 января 2010

Я думаю, что было бы гораздо проще сделать это, просто добавив битовую маску или альфа-канал. В этом случае вы должны использовать отрицательное изображение маски вашей фигуры, а затем просто применить его к обычному изображению в качестве маски, а затем сохранить в прозрачном формате. На самом деле я никогда не делал этого с GD или ImageMagick, но я думаю, что он доступен, как предлагает Джерри.

На самом деле, вот пост блога, похожий на вопрос SO, который может помочь: http://about.phalacee.com/geek/creating-mask-layers-using-php-gd

2 голосов
/ 22 января 2010

Обычный способ сделать что-то подобное: использовать белый (все 1) и черный (все 0) контур вместо прозрачных и непрозрачных. Затем вы И это изображение с изображением, которое вы пытаетесь обрезать. В результате получаются 0, где контурное изображение имеет 0, а другое изображение, где контур имеет 1.

Вам также может понадобиться инвертировать ваше контурное изображение и И инвертированную версию с фоновым изображением. Затем вы ИЛИ фоновое изображение с изображением на переднем плане, чтобы получить композит изображения на переднем плане в форме Айдахо (если использовать ваш пример) и фоновое изображение везде.

В зависимости от возможностей используемой вами библиотеки, есть все шансы, что такая возможность доступна напрямую. Например, Windows имеет такую ​​возможность в функции MaskBlt.

1 голос
/ 23 января 2010

В php использование ImageMagick, вероятно, является лучшим выбором:

$source = IMagick("sourcefile");
$mask = IMagick("maskfile");
$mask->adaptiveResizeImage($source->getImageWidth(), $source->getImageHeight(), true);
$source->compositeImage($mask, imagick::COMPOSITE_MULTIPLY, 0, 0);
$source->writeImage("newfile");
$source->clear();
$source->destroy();

sourcefile должен быть исходным изображением, как вам нравится, maskfile должен быть файлом маски, в котором альфа-канал установлен правильно для нужной фигуры.

...