我的系统接受以下格式的图像文件: png,jpg,gif。相同的文件可能会使用不同的元数据集到达我的系统,我需要唯一地识别它们,无论他们的元数据。
我尝试使用PHP模块Imagick,读取图像,剥离元数据,然后对它们进行哈希处理。
// example_image: https://ibb.co/bVkanv
$image_path = ‘example.jpg’;
$stripped_image_path = ‘stripped_example.jpg’;
$img = new Imagick($image_path);
$img->stripImage();
$img->writeImage($stripped_image_path);
$image_hash = sha1_file($stripped_image_path);
然而,这种方法不能正常工作,因为哈希值有所不同:
// example_image: https://ibb.co/bVkanv
$original_image = ‘Example.jpg’;
$image1_path = ‘example1.jpg’;
$image2_path = ‘example2.jpg’;
$stripped_image1_path = ‘stripped_example1.jpg’;
$stripped_image2_path = ‘stripped_example2.jpg’;
$imagick_1 = new Imagick($original_image);
$imagick_1->setImageProperty('Exif:Make', 'Imagick_1');
$imagick_1->writeImage($image1_path);
$imagick_2 = new Imagick($original_image);
$imagick_2->setImageProperty('Exif:Make', 'Imagick_2');
$imagick_2->writeImage($image2_path);
// Now example1.jpg and example2.jpg SHOULD be the same image with different metadata
$imagick_1 = new Imagick($image1_path);
$imagick_1->stripImage();
$imagick_1->writeImage($stripped_image1_path);
$imagick_2 = new Imagick($image2_path);
$imagick_2->stripImage();
$imagick_2->writeImage($stripped_image2_path);
$hash = sha1_file($image_path);
$stripped_hash1 = sha1_file($stripped_image1_path);
$stripped_hash2 = sha1_file($stripped_image2_path);
$hash
88f454a5f768d633f9d5b8fbba73cdc9dfa46f59
$stripped_hash1
fd385aa6ebcf8018a725598df945f925d8e05d58
$stripped_hash2
d9c9bca4f4433556d5c4c0d62ce06de06920e69b
我如何实现目标?
答案 0 :(得分:0)
我终于用Imagick解决了这个问题。
$image = new \imagick($path);
$hash = $image->getImageSignature();
现在,如果在同一图像中元数据发生变化,则散列将是相同的。