如何设置原始图像的最大宽度?


11

案例: 我有一个不太了解数字世界的客户。但是她所知道的是如何将照片从她的相机上传到计算机和WordPress中。但是,她不知道如何将照片缩小到正常尺寸。

解决方案: 我喜欢WordPress自动将背景中的这些照片缩小到最大1024px的宽度。

问题: 尽管我可以在设置中设置最大宽度,但是我可以设置$ content_width,也可以使用'add_image_size'添加新图像尺寸。原始照片仍以其原始大小存储在上载文件夹中。意味着硬盘空间将很容易装满。

问题: 我应该在functions.php中放入什么以使WordPress缩小原始图像的大小(如果它大于最大宽度)?

Answers:


6

我可以使用以下代码解决它:

function my_handle_upload ( $params )
{
    $filePath = $params['file'];

    if ( (!is_wp_error($params)) && file_exists($filePath) && in_array($params['type'], array('image/png','image/gif','image/jpeg')))
    {
        $quality                        = 90;
        list($largeWidth, $largeHeight) = array( get_option( 'large_size_w' ), get_option( 'large_size_h' ) );
        list($oldWidth, $oldHeight)     = getimagesize( $filePath );
        list($newWidth, $newHeight)     = wp_constrain_dimensions( $oldWidth, $oldHeight, $largeWidth, $largeHeight );

        $resizeImageResult = image_resize( $filePath, $newWidth, $newHeight, false, null, null, $quality);

        unlink( $filePath );

        if ( !is_wp_error( $resizeImageResult ) )
        {
            $newFilePath = $resizeImageResult;
            rename( $newFilePath, $filePath );
        }
        else
        {
            $params = wp_handle_upload_error
            (
                $filePath,
                $resizeImageResult->get_error_message() 
            );
        }
    }

    return $params;
}
add_filter( 'wp_handle_upload', 'my_handle_upload' );

原始文件上传后为3,3Mb,大尺寸设置为2048x2048,服务器上仅占用375Kb(减少了90%!)。


1
您介意我是否在博客文章中将此代码与答案中的其他代码一起使用?
汤姆·J·诺维尔

如果您觉得它有用,我不在乎,您的博客是什么?
2012年

我的网站是tomjn.com,我还没有写这个帖子,下周我会写的,完成后在这里发布URL
Tom J Nowell

3

调整大小已完成以创建大/中/缩略图尺寸,但是您面临的问题是,由于内存不足或时间不足,图像太大而无法调整大小。

因此,调整大小不是一种选择,如果不是,那么就不会遇到问题。相反,请尝试限制图片的大小,因此,如果上传了20MB,则会拒绝并显示一条消息,指出需要缩小大小。

基于图像面积/百万像素的限制:

<?php
/**
 * Plugin Name: Deny Giant Image Uploads
 * Description: Prevents Uploads of images greater than 3.2MP
 */

function tomjn_deny_giant_images($file){
    $type = explode('/',$file['type']);

    if($type[0] == 'image'){
        list( $width, $height, $imagetype, $hwstring, $mime, $rgb_r_cmyk, $bit ) = getimagesize( $file['tmp_name'] );
        if($width * $height > 3200728){ // I added 100,000 as sometimes there are more rows/columns than visible pixels depending on the format
            $file['error'] = 'This image is too large, resize it prior to uploading, ideally below 3.2MP or 2048x1536';
        }
    }
    return $file;
}
add_filter('wp_handle_upload_prefilter','tomjn_deny_giant_images');

基于宽度或高度的限制:

/wordpress//posts/67110/revisions

<?php
/** Plugin Name: (#67107) »kaiser« Restrict file upload */

function wpse67107_restrict_upload( $file )
{
    $file_data = getimagesize( $file );
    // Handle cases where we can't get any info:
    if ( ! $file_data )
        return $file;

    list( $width, $height, $type, $hwstring, $mime, $rgb_r_cmyk, $bit ) = $file_data;

    // Add conditions when to abort
    if ( $width > 2048 )
        $file['error'] = 'Error statement';

    return $file;
}
add_filter( 'wp_handle_upload_prefilter', 'wpse67107_restrict_upload' );

按区域限制将允许调整图像的高/窄或宽/短图像,尺寸限制可能更容易解释


好吧,我一直在认真思考自己想要的东西,我想要的是原始图像将具有与设置为“大”图像尺寸的尺寸相同的尺寸。为了做到这一点,我想我必须检查一下“ wp_handle_upload”,您认为呢?
标记

嗯,您确实有大号/中号的尺寸,您只是想防止原件被使用?我以为您的意思是她正在上传大量图像,并且始终使用大量版本,而不生成较小版本?
汤姆·J·诺维尔

1
但是这个钩子听起来很合适,甚至wp_handle_upload_prefilter上面列出的过滤器也不错,只要您写回原始文件,一些PHP调整代码大小而不是添加错误就可以解决问题。不过,仍需要进行测试
Tom J Nowell

你是对的。正在生成所有适当的大小,我只是不明白为什么在“设置”页面中设置了大小后,WordPress为什么会保留原始大小。或者,您可以选择“保留原件”作为签入选项。只是我的2美分...
马克

1
因为它需要保存文件以便随后将其用于其他大小,并且需要进行任何修改或重新生成
Tom J Nowell
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.