压缩原始图像后是否保留图像EXIF信息?

时间:2016-04-11 作者:Advanced SEO

经过测试,我意识到Word Press在上传图像后会生成原始图像的中等大小和缩略图大小的图像without EXIF/IPTC info

我意识到这是因为我的主机上使用了GD图像库,默认情况下GD库就是这样工作的,去掉所有图像信息。

经过研究,我发现如果使用ImageMagick和Imagick PHP扩展来代替GD库,那么EXIF信息将保留在生成的调整大小的图像文件中(使用ImageMagick默认设置)。

<小时>

UPDATE 1

ImageMagick和Imagick PHP扩展现在已安装在我的主机上。现在,所有生成的图像都保留了进出口/IPTC信息(原始图像、中间图像和缩略图,所有图像都包含进出口/IPTC数据)。

我允许访问者在网站上上传高分辨率图像,在大多数情况下,访问者在上传之前不会优化/压缩图像,有时图像文件的大小相当大。

例如,12MP图像可以是10 MB,但经过85%的jpeg压缩后,其文件大小可以小2-3倍,几乎没有明显的质量损失。

我将此函数设置为函数。php(我的主题文件夹)在上传过程中压缩原始图像,以节省磁盘空间,并加快高分辨率图像在页面上的加载速度。

// Image compression on upload, compress original image
function wt_handle_upload_callback( $data ) {
    $image_quality = 85; // 85% compression
    $file_path = $data[\'file\'];
    $image = false;

    switch ( $data[\'type\'] ) {
        case \'image/jpeg\': {
            $image = imagecreatefromjpeg( $file_path );
            imagejpeg( $image, $file_path, $image_quality );
            break;          
        }

        case \'image/png\': {
            $image = imagecreatefrompng( $file_path );
            imagepng( $image, $file_path, $image_quality );
            break;          
        }

        case \'image/gif\': {         
            // Nothing to do
            break;
        }
    }

    return $data;
}
add_filter( \'wp_handle_upload\', \'wt_handle_upload_callback\' );
它工作正常,原始图像被压缩,但此函数会删除所有图像上的EXIF/IPTC数据(我需要保持EXIT,至少在原始图像上)。如果没有上述功能,原始图像和所有调整大小的图像都带有EXIF/IPTC数据(因为安装了ImageMagick),但原始图像的压缩程度不超过。

如何修复、调整上述功能以保持EXIF?

UPDATE 2

WP 4.5进行了一些图像阴影改进,并提供了保留图像EXIF数据的选项(以防在主机上使用ImageMagic,以我为例)。WP 4.5引入了新的过滤器“image\\u strip\\u meta”,可用于在生成的调整大小的图像(中等大小和缩略图)上保留或删除EXIF。

当使用上述压缩原始图像的功能(从原始图像和所有调整大小的图像版本中删除所有EXIF数据)时,是否可以使用此过滤器将EXIF保留在原始图像中?

或者,还有什么会导致在上传后立即压缩原始图像并将EXIF保留在原始图像中?

2 个回复
最合适的回答,由SO网友:cybmeta 整理而成

问题是您使用的函数来自GD library 操作图像,而不是函数WordPress Image API (WP_Image_Editor class). 因此,WordPress不适用于代码生成的图像。

WordPress图像API使用ImageMagick(如果可用),否则使用GD库。

为了保存EXIF数据:

如果使用GD库,则需要使用EXIF exension 并使用配置PHP--enable-exif flag.EXIF and other meta data is preserved. 此外,您还可以访问image_strip_meta 过滤器(如果使用GD库,则不可用)安装了ImageMagick后,可以使用它代替GD库。或者,最好使用WordPress API:

add_filter( \'wp_handle_upload\', \'wt_handle_upload_callback\' );
function wt_handle_upload_callback( $data ) {

    // get instance of WP_Image_Editor class
    $image = wp_get_image_editor( $data[\'file\'] );

    if( ! is_wp_error( $image ) ) {
        $image->set_quality( 85 );
        $image->save( $data[\'file\'], $data[\'type\'] );
    }

    return $data;
}
I\'ve not tested the above code 我想你不需要它。如果做这一切的唯一方法是压缩图像,那么您必须知道WordPress已经将图像压缩到82%的质量(90 before WP 4.5). 如果需要更改压缩质量,只需使用jpeg_quality filter:

add_filter( \'jpeg_quality\', \'cyb_set_jpeg_quality\' );
function cyb_set_jpeg_quality() {
    return 85;
}

SO网友:Mark Kaplun

您不应该假设与图像相关的元数据在wordpress图像操作中仍然存在。正如您所发现的,这取决于服务器上安装的图像处理库,实际上在4.5版中,目标是剥离其中的一些,如这里所述https://make.wordpress.org/core/2016/03/12/performance-improvements-for-images-in-wordpress-4-5/.

如果您需要元数据作为缩略图的一部分(我不明白您为什么需要它),那么您应该直接调用php图像处理API,然后更新wordpress DB以设置适当的字段,就像wordpress API处理它一样(可能可以使用一些过滤器来完成,而不会对整个过程进行太多更改)

相关推荐

Images with overlay

我有一些图片在一个容器中,我想添加一个覆盖和图标。这不是现成的,但我找到了一些有用的代码:HTML:<div class=\"main\"> <span class=\"featured\"><img src=\"http://joshrodg.com/IMG_001-258x258.jpg\" title=\"\" alt=\"\"></span> </div> CSS:.featured {