In the field of image processing, achieving consistent color tones across multiple images is a common need, particularly for industries like e-commerce, social media, and photography. The PHP function imagecolormatch(), though not widely known, is a powerful tool for this purpose. This article will introduce how to efficiently batch process color matching for images using imagecolormatch(), along with a complete example solution.
imagecolormatch(resource $image1, resource $image2): bool is a function from the GD library that adjusts the palette colors of $image2 to closely match those of $image1. This means the colors of $image2 are modified to "look like" those of $image1, achieving color consistency.
Note that imagecolormatch() only works with palette-based images (i.e., non-true color images created with imagecreate()), so images must be converted to palette images before using this function.
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 result as a new image file.
Below is a complete example script that applies 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 the reference image and convert it to a 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 through all jpg files in the directory<br>
$files = glob($sourceDir . '*.jpg');<br>
foreach ($files as $file) {<br>
if ($file === $referencePath) continue; // Skip the reference image</p>
// Create a 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 the output file
$filename = basename($file);
imagejpeg($srcPalette, $outputDir . $filename);
// Free memory
imagedestroy($srcTrueColor);
imagedestroy($srcPalette);
}
imagedestroy($refImgTrueColor);
imagedestroy($refImgPalette);
echo "Processing completed, files saved to $outputDir";
?>
Converting images to palette format is a crucial step, otherwise imagecolormatch() will not work.
The output images may experience some color distortion since palette images have a limited number of colors (up to 256).
If you need to process a large number of images, it is recommended to run this script via the command line and use process control techniques (such as batch processing) to improve efficiency.
You can package this solution as a command-line tool or integrate it into your own image management system. For example, by combining it with Laravel’s Artisan command system, you can run:
php artisan image:match-colors --reference=reference.jpg --input=images/ --output=output/
Once image color standardization is achieved, whether for e-commerce product displays or photography portfolios, you can deliver a more unified and professional visual presentation.
If you want to see a demonstration, visit the following sample site where you can upload your own reference and target images for testing:
https://m66.net/demo/image-match
By properly leveraging imagecolormatch(), we can not only enhance image quality consistency but also greatly save manual effort in batch workflows. Hopefully, this article helps you get started quickly and build your own image color processing toolchain.