Я хочу обрезать прямоугольное изображение к непрямоугольной форме. Я понимаю, что при взятии этого полностью буквально это не возможно. То, с чем я хочу закончить, является изображением X, обрезанный для формирования Y, на прозрачном фоне.
Скажем, например то, что я хочу сделать снимок флага Айдахо и обрезать его к форме Айдахо. Я предполагаю, что сделал бы что-то вроде этого:
Шаг 1 был бы, очевидно, сделан вручную, но остальные будут сделаны программно. Я думаю, что имею верное представление в целом, но я не знаю, как я приблизился бы к специфическим особенностям. Кто-либо может указать на меня в правильном направлении?
Насколько технология реализации идет, я - парень PHP, таким образом с помощью gdLibrary или что-то, что работает с PHP, вероятно, был бы лучший способ для меня пойти.
Я бы подумал, что это было бы намного проще сделать, просто добавив битовую маску или альфа-канал. В этом случае вы бы использовали отрицательное изображение маски своей формы, а затем просто применили бы его к обычному изображению в качестве маски, а затем сохранили бы в прозрачном формате. Я никогда на самом деле не делал этого с GD или ImageMagick, но я бы думал, что он доступен, как предлагает Джерри.
На самом деле вот запись в блоге форму аналогичный вопрос SO, который может помочь: http://about.phalacee.com/geek/creating-mask-layers-using-php-gd
Обычный способ сделать что-то вроде этого, будет использовать белые (все 1) и черные (все 0) для вашего наброска вместо прозрачного и непрозрачного. Тогда вы и это изображение с изображением вы пытаетесь обрезать. Результатом равен 0, где имел план наброска 0, а другое изображение, где было наброски 1 есть.
Вам также может потребоваться инвертировать вашу структуру, а также перевернутую версию с фоновым изображением. Тогда вы или фоновое изображение с изображением переднего плана для создания композита изображения переднего плана в форме Айдахо (чтобы использовать ваш пример) и фоновое изображение повсюду.
В зависимости от возможностей библиотеки, которую вы используете, существует большая вероятность того, что возможно, возможно, доступны непосредственно. Также например, Windows имеет эту возможность в функции Maskblt
.
В 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 должен быть файлом маски, который правильно установлен альфа-канал для нужной формы.