Как я программно обрезал бы изображение к непрямоугольной форме?

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

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

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

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

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

5
задан devios1 12 August 2010 в 21:16
поделиться

3 ответа

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

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

2
ответ дан 14 December 2019 в 19:13
поделиться

Обычный способ сделать что-то вроде этого, будет использовать белые (все 1) и черные (все 0) для вашего наброска вместо прозрачного и непрозрачного. Тогда вы и это изображение с изображением вы пытаетесь обрезать. Результатом равен 0, где имел план наброска 0, а другое изображение, где было наброски 1 есть.

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

В зависимости от возможностей библиотеки, которую вы используете, существует большая вероятность того, что возможно, возможно, доступны непосредственно. Также например, Windows имеет эту возможность в функции Maskblt .

2
ответ дан 14 December 2019 в 19:13
поделиться

В 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 должен быть файлом маски, который правильно установлен альфа-канал для нужной формы.

1
ответ дан 14 December 2019 в 19:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: