In the field of image processing, achieving consistent color tones across multiple images is a common requirement, especially for industries like e-commerce, social media, and photography. Although PHP’s imagecolormatch() function is relatively unknown, it is a powerful tool to accomplish this goal. This article will introduce how to efficiently batch process images for color matching using imagecolormatch() and provide a complete example solution.
imagecolormatch(resource $image1, resource $image2): bool is a function in the GD library that adjusts the palette colors of $image2 to closely match those of $image1. This means the colors of $image2 will be modified to "look like" those of $image1, achieving color consistency.
Note that imagecolormatch() only works with palette images (i.e., non-truecolor images created with imagecreate()), so images must be converted to palette format before use.
Prepare a “reference image” to serve as the color standard for all target images.
Load each image to be processed and convert it into a palette image.
Use imagecolormatch() to perform color matching.
Save the resulting image as a new file.
Below is a complete example script to apply color matching to multiple images. The directory structure is as follows:
/images/
reference.jpg
img1.jpg
img2.jpg
...
/output/
(used to save processed images)
<?php
<p>$referencePath = 'images/reference.jpg';<br>
$sourceDir = 'images/';<br>
$outputDir = 'output/';</p>
<p>// Load reference image and convert to palette image<br>
$refImgTrueColor = imagecreatefromjpeg($referencePath);<br>
$refImgPalette = imagecreate(imagesx($refImgTrueColor), imagesy($refImgTrueColor));<br>
imagecopy($refImgPalette, $refImgTrueColor, 0, 0, 0, 0, imagesx($refImgTrueColor), imagesy($refImgTrueColor));<br>
imagetruecolortopalette($refImgPalette, true, 256);</p>
<p>// Iterate over all jpg files in the directory<br>
$files = glob($sourceDir . '*.jpg');<br>
foreach ($files as $file) {<br>
if ($file === $referencePath) continue; // Skip reference image</p>
// Create palette image
$srcPalette = imagecreate(imagesx($srcTrueColor), imagesy($srcTrueColor));
imagecopy($srcPalette, $srcTrueColor, 0, 0, 0, 0, imagesx($srcTrueColor), imagesy($srcTrueColor));
imagetruecolortopalette($srcPalette, true, 256);
// Apply color matching
imagecolormatch($refImgPalette, $srcPalette);
// Save output file
$filename = basename($file);
imagejpeg($srcPalette, $outputDir . $filename);
// Free memory
imagedestroy($srcTrueColor);
imagedestroy($srcPalette);
}
imagedestroy($refImgTrueColor);
imagedestroy($refImgPalette);
echo "Processing complete. Files saved to $outputDir";
?>
Converting to a palette image is a critical step; otherwise, imagecolormatch() will not work.
Output images may exhibit some color distortion because palette images support a limited number of colors (up to 256).
If you need to process a large number of images, it’s recommended to run the script from the command line and use process control (such as batching) to improve efficiency.
You can package this solution into a command-line tool or integrate it into your image management system. For example, by combining with Laravel’s Artisan command system, you can run it like this:
php artisan image:match-colors --reference=reference.jpg --input=images/ --output=output/
After standardizing image colors, whether for e-commerce product displays or photography portfolios, you can achieve a more unified and professional visual effect.
If you want to see a demonstration, you can visit the following example site to upload your own reference and target images for testing:
https://m66.net/demo/image-match
By making proper use of imagecolormatch(), we can not only improve the consistency of image quality but also greatly save labor and time costs in batch workflows. Hopefully, this article helps you quickly get started and build your own image color processing toolchain.