Фильтр изображений php colorize уничтожает детали изображения

я пытаюсь раскрасить черно-белую картинку на моем сервере.

я пытался сделать это несколькими способами, и единственный, который работает, - это gd imagefilter через фильтр IMG_FILTER_COLORIZE.

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

исходное изображениераскрашенное изображение

этот результат был достигнут с помощью этого кода

$im=imagecreatefromjpeg($orig_file);
imagefilter($im, IMG_FILTER_COLORIZE, 71, 92, 10);
imagejpeg($im, $output_file, 95);

почему это происходит? есть ли другие методы, как я могу раскрасить изображение? мое исходное изображение довольно большое, и я не могу перебирать его, так как оно слишком медленное; вот почему я пытаюсь использовать библиотеку, которая сделает это


person user151496    schedule 11.03.2014    source источник


Ответы (1)


Мне удалось добиться желаемого результата с помощью Imagick и CompositeImage. вот результат

исходное изображениежелаемый результат

Как я этого добился, это своего рода трюк, который работает только в очень специфических условиях - это необходимость иметь белый фон и только черные / серые объекты впереди (или полная противоположность). этот метод не будет работать на фоне с прозрачностью

идея состоит в том, чтобы иметь 2 слоя: нижний слой с исходным изображением в градациях серого и верхний слой, полностью заполненный желаемым цветом. затем вы скомпонуете эти изображения, используя «COMPOSITE_LIGHTEN» (вы можете использовать другие методы, например, затемнить, если у вас есть белые объекты на черном фоне)

это код

$base_color="#475c0a";
$im=new Imagick($orig_file);

$im2 = new Imagick();
$im2->newImage($im->getImageWidth(), $im->getImageHeight(), new ImagickPixel($base_color) );

$im->compositeImage($im2, Imagick::COMPOSITE_LIGHTEN, 0, 0);

$im->writeImage($new_image_path);

надеюсь, это поможет кому-то

person user151496    schedule 15.03.2014