Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prevent imagejpeg() from saving EXIF data for images (spec. FileDateTime)

Tags:

php

exif

gd

Our server is saving EXIF data to every file saved with imagejpeg(). As far as I know, this is not the default behavior (or even possible, from what I've read). But, it is occurring, and due to the FileDateTime information being included (and using the time of save), it is breaking functionality in our upload/approval system (md5_file() returns a different value for the exact same image due to FileDateTime always being different).

Is there a way to prevent imagejpeg() from saving EXIF data for images by default?

Server Information

  • CentOS 5
  • Parallels Plesk Panel 10.4.4
  • GD Version: bundled (2.0.34 compatible)
  • PHP 5.3

Code

<?php
public function upload_book_cover($book, $cover, $filename = NULL, $approved = NULL){
    global $c_consummo, $user;
    $approved = bool($approved, true, true);
    if(filesize($cover)>5242880){
        return false; // Too large;
    }
    $max_width = 450;
    $cover_info = getimagesize($cover);
    if(!$this->is_valid_book_cover_type($cover_info['mime'])){
        return false; // Invalid image type
    }
    $width = $cover_info[0];
    $height = $cover_info[1];
    if($width<200){
        return false; // Too small
    } elseif($width>1500){
        return false; // Too wide
    }
    $original_cover = false;
    switch($cover_info[2]){
        case IMAGETYPE_GIF:
            $original_cover = imagecreatefromgif($cover);
            break;
        case IMAGETYPE_JPEG:
            $original_cover = imagecreatefromjpeg($cover);
            break;
        case IMAGETYPE_PNG:
            $original_cover = imagecreatefrompng($cover);
            break;
        case IMAGETYPE_BMP:
            $original_cover = imagecreatefrombmp($cover);
            break;
    }
    if(!$original_cover){
        return false; // Unsupported type
    }
    if($width>$max_width){
        $new_width = $max_width;
    } else {
        $new_width = $width;
    }
    $new_height = round($height*($new_width/$width));
    $new_cover = imagecreatetruecolor($new_width, $new_height);
    if(!$new_cover){
        return false; // Could not create true color image
    }
    if(!imagecopyresampled($new_cover, $original_cover, 0, 0, 0, 0, $new_width, $new_height, $width, $height)){
        return false; // Could not copy image
    }
    if(!imagejpeg($new_cover, $cover, 100)){
        return false; // Image could not be saved to tmp file
        // This is adding *new* EXIF data to images by itself
    }
    $file_hash = md5_file($cover);
    $duplicate_book_cover = $this->find_duplicate_book_cover($book, $file_hash);
    if($duplicate_book_cover){
        return $duplicate_book_cover;
    }
    $file_id = $c_consummo->upload_file($cover, $filename);
    ...
}
like image 778
0b10011 Avatar asked Apr 30 '12 17:04

0b10011


2 Answers

It looks like you have tried several things here, but lets try one more. Do you EVER need EXIF information in your application? If not lets take out support for EXIF and see if that completely removes it.

If it does not remove it, then perhaps the functions are reading it from the existing photos and then just blindly including it in the file that is written. You can know for sure by printing out the EXIF information at each step of process

like image 82
Michael Blood Avatar answered Sep 21 '22 13:09

Michael Blood


No idea why EXIF data is being written - so the following may help you remove it.

One suggestion is to run something as a command on the server - it will need some installation: http://hacktux.com/read/remove/exif - then run throuhg EXEC from PHP.

There's also solution posted here that uses ImageMagick if you also have that installed (or cen get it installed: Remove EXIF data from JPG using PHP (but note warning about colour)

Otherwise, the other suggestion is as above, try turning off the EXIT extension.

Sorry if they don't help, but you did ask for any suggestions.

like image 26
Robbie Avatar answered Sep 19 '22 13:09

Robbie