Imagick — создайте два разных уровня прозрачности

У меня есть изображение, которое я использую для тестирования. Вот:

тестовое изображение

С PHP Imagick я смог сделать все, что хотел, кроме создания png с несколькими уровнями прозрачности. Возможно, проблема в том, что я не понимаю, как прозрачность хранится в png.

Допустим, я пытаюсь создать прозрачную область треугольника, но затем создаю область многоугольника со вторым уровнем прозрачности, область, которая является полупрозрачной.

Я пытался использовать setOpacity () до и после изменений, но не повезло.

Я также создал два отдельных объекта ImagickDraw () и дал им другой fillColor без удачи. Вот пример моей последней попытки:

$img = new Imagick('rec.png');
$height = $img->getImageHeight();
$width = $img->getImageWidth();

//Create a new transparent image of the same size
$mask = new Imagick();
$mask->newImage($width, $height, new ImagickPixel('none'));
$mask->setImageFormat('png');

//Draw onto the new image the areas you want to be transparent in the original
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('#999999'));
//$draw->rectangle( 10,10,100,100 );
$points = [
['x' => 400, 'y' => 0],
['x' => 400, 'y' => 200],
['x' => 700, 'y' => 0],
['x' => 400, 'y' => 0],
];
$draw->polygon($points);

$tdraw = new ImagickDraw();
$tdraw->setFillColor('rgb(90, 90, 90)');
$npoints = [
['x' => 0, 'y' => 0],
['x' => 0, 'y' => 200],
['x' => 400, 'y' => 200],
['x' => 700, 'y' => 0],
['x' => 0, 'y' => 0],
];
$tdraw->polygon($npoints);

$mask->drawImage( $draw );
$mask->drawImage( $tdraw );
$mask->negateImage(true, Imagick::CHANNEL_ALPHA);

// Composite the images using Imagick::COMPOSITE_DSTOUT
$img->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);

Все, что направит меня в правильном направлении, будет огромной помощью … спасибо!

0

Решение

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

  1. Нарисуйте две отдельные фигуры с разными значениями прозрачности.
  2. Составьте их вместе.
  3. Примените полученное изображение в качестве маски изображения.

Я бы предложил переписать код как …

$img = new Imagick('rec.png');
$height = $img->getImageHeight();
$width = $img->getImageWidth();

// Create first mask from original (and possible preserve original transparancies).
$mask = clone($img);
// We can "extract" the alpha channel to create a full white image.
$mask->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT);
// Create second mask from frist.
$mask2 = clone($mask);

//Draw onto the new image the areas you want to be transparent in the original
$draw = new ImagickDraw();
$draw->setFillColor('gray90'); //<= Simplify with common color names
$points = [
['x' => 400, 'y' => 0],
['x' => 400, 'y' => 200],
['x' => 700, 'y' => 0],
['x' => 400, 'y' => 0],
];
$draw->polygon($points);

$tdraw = new ImagickDraw();
$tdraw->setFillColor('gray50'); //<= Something diffrent for visiblity.
$npoints = [
['x' => 0, 'y' => 0],
['x' => 0, 'y' => 200],
['x' => 400, 'y' => 200],
['x' => 700, 'y' => 0],
['x' => 0, 'y' => 0],
];
$tdraw->polygon($npoints);

$mask->drawImage( $draw );
$mask2->drawImage( $tdraw );
// We can merge the values by multiplication. Might be worth exploring "SCREEN" & "BLEND" options
$mask->compositeImage($mask2, Imagick::COMPOSITE_MULTIPLY, 0, 0);
// Copy the values to alpha/opacity channel
$mask->setImageAlphaChannel(Imagick::ALPHACHANNEL_COPY);
// Copy the opacity from the mask to the original image.
$img->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);
$img->writeImage('output.png');

два разных уровня прозрачности

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]