经过测试,我意识到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保留在原始图像中?
最合适的回答,由SO网友:cybmeta 整理而成
问题是您使用的函数来自GD library 操作图像,而不是函数WordPress Image API (WP_Image_Editor
class). 因此,WordPress不适用于代码生成的图像。
WordPress图像API使用ImageMagick(如果可用),否则使用GD库。
为了保存EXIF数据:
如果使用GD库,则需要使用EXIF exension 并使用配置PHP--enable-exif
flag.如果ImageMagick可用,WordPress将使用它并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;
}