I am a new developer on a pre-built site trying to figure out how to use the set up ImageMagick tool. The way we are using it is to change the color of products automatically using the HALD CLUT filter.
I got it running yesterday but the output images are having black lines all over them. I tested changing file type/format on the product image and the HALD CLUT filter but no luck, so I'm assuming it has something to do with ImageMagick.
Screen capture of outputted image
Does anyone have any idea what would cause this?
Here is the code for the ImageMagick Color Generator:
class SwatchGenerator {
public $mask;
public $swatches;
public $types;
public $th;
public $base_url;
public $results;
public $type;
public $color;
public $output;
function __construct ($overwrite = false) {
$this->th = \Loader::helper('text');
$this->base_url = \View::url('/');
$this->overwrite = $overwrite;
$this->delimiter = '~';
$this->results = [];
$this->loadSwatches();
$this->loadTypes();
}
function loadSwatches () {
$swatches = \Express::getObjectByHandle('swatch')->getEntries();
foreach ($swatches as $swatch) {
$handle = $this->th->urlify($swatch->getSwatchName());
$filter = $swatch->getSwatchFilter();
$this->swatches[$handle] = (is_object($filter)) ? $this->getImagickInstance($filter) : false;
}
}
function loadTypes () {
$types = \Concrete\Core\File\Image\Thumbnail\Type\Type::getVersionList();
foreach ($types as $type) {
$type_handle = $type->getHandle();
if (strpos($type_handle, '_2x') === false && strpos($type_handle, 'product_') !== false) {
$this->types[$type_handle] = $type;
}
}
}
function setType ($type) {
$this->type = $type;
}
function setColor ($color) {
$this->color = $color;
}
function setOutput ($output) {
$this->output = $output;
}
function log ($message) {
$this->addResult($message);
// \Log::addEntry($message);
}
function addResult ($message) {
$this->results[] = $message;
}
function getResults () {
return $this->results;
}
function getResultLog ($delimiter = "\n\r") {
return implode("\n\r", $this->getResults());
}
function generate ($base_file, $allowed_type = false) {
$mask_file = $base_file->getAttribute('color_mask');
if (!is_object($mask_file)) {
$this->log('Mask not found.');
return;
}
if ($base_file->getAttribute('width') != 2560) {
$this->log('Invalid image size found. Must be 2560px wide.');
return;
}
// these are our core images that should not change for any swatch
$base = $this->getImagickInstance($base_file);
// we do this to remove any trace of transparency and flatten the file
// resolves issues with odd masking we were seeing
$base->setImageBackgroundColor('white');
// $base->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$base->setImageAlphaChannel(11);
$base->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
// jpg output
$base->setImageFormat('jpg');
$base->setImageCompressionQuality(85);
$mask = $this->getImagickInstance($mask_file);
$overlay = clone ($base);
$overlay->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);
// base path to write the swatches to
$base_file = $this->parsePath($base_file->getRelativePath());
$pathinfo = pathinfo($base_file);
// stores our composited swatch images
$swatches = [];
// now create an image for each swatch we have
foreach ($this->swatches as $swatch_handle => $filter) {
// if we are limited to a color, then abort if we are not on it
if ($this->color && $this->color != $swatch_handle) {
continue;
}
$swatch = clone ($base);
if ($filter) {
$swatch->haldClutImage($filter);
}
$swatch->compositeImage($overlay, imagick::COMPOSITE_DEFAULT, 0, 0);
$swatches[$swatch_handle] = $swatch;
foreach ($this->types as $type_handle => $type) {
// filter non-product types
if ($allowed_type && $allowed_type !== $type_handle) {
continue;
}
// if we are limited to a type, then abort if we are not on it
if ($this->type && $this->type != $type_handle) {
continue;
}
$output_path = $pathinfo['dirname'] . '/' . $pathinfo['filename'] . $this->delimiter . $type_handle . $this->delimiter . $swatch_handle . '.jpg';
if (file_exists($output_path) && !$this->overwrite) {
$this->log('Skipping existing file at ' . $output_path);
} else {
$this->log('Rendering ' . $this->th->unhandle($swatch_handle) . ' at ' . $type->getWidth() . 'px (' . $type_handle . ')');
$output = clone ($swatch);
$output->resizeImage($type->getWidth(), 0, Imagick::FILTER_LANCZOS, 0);
$output->writeImage('../' . $output_path);
if ($this->output) {
$this->addResult("<img src='/{$output_path}' />");
}
}
}
}
}
function getImagickInstance ($file, $type = false) {
if (is_object($file)) {
$path = ($type) ? $file->getThumbnailURL($type) : $file->getRelativePath();
$image = new Imagick($this->parsePath('../' . $path));
$image->setImageFormat('png');
$image->setFormat('png');
return $image;
}
}
function parsePath ($path) {
// strip leading slash
$path = preg_replace('/^\//', '', $path);
return str_replace($base_url, '', $path);
}
}
I am on PHP version 7.0.3.3, Imagick version 3.4.3, and ImageMagick 6.9.6-2.
I cannot access your original image. But I did download your Hald image. So I applied it to the following image in ImageMagick 6.9.11.28 Q16 Mac OSX in the command line and it works fine - at least no lines. So I suspect an issue with your ImageMagick version or Imagick version or your code. You might try running my command in PHP exec() and see if that works. It will tell you if ImageMagick is working properly or not. It might also be an issue with your input image or your libpng delegate version.
Input:
Hald image: