无论元数据如何都散列图像

时间:2017-07-12 16:33:43

标签: php image hash imagick

我的系统接受以下格式的图像文件: 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

我如何实现目标?

1 个答案:

答案 0 :(得分:0)

我终于用Imagick解决了这个问题。

$image = new \imagick($path);
$hash = $image->getImageSignature();

现在,如果在同一图像中元数据发生变化,则散列将是相同的。