web-dev-qa-db-ja.com

元の画像の最大幅をどのように設定できますか?

ケース: デジタルの世界についてあまり知らないクライアントがいる。しかし、彼女が知っているのは、自分のカメラからコンピュータに、そしてWordPressで写真を取得する方法です。しかし、彼女は写真を通常のサイズに縮小する方法を知りません。

解決策: WordPressが背景の写真を自動的に最大幅1024ピクセルに縮小するのが好きだ。

問題: 設定で最大幅を設定できますが、$ content_widthを設定でき、 'add_image_size'で新しい画像サイズを追加できます。元の写真は元のサイズのままアップロードフォルダに保存されます。ハードディスクの空き容量がいっぱいになりやすいということです。

質問: WordPressに元の画像を縮小させるには、functions.phpに何を入れる必要がありますか(最大幅よりも大きい場合)。

11
Mark

私は以下のコードを使用してそれを解決することができました:

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%削減)。

6
Mark

サイズ変更はすでに大/中/親指サイズを作成するために行われていますが、あなたが直面している問題は、メモリ不足や時間不足のために画像がサイズ変更するには大きすぎることです。

そのため、サイズ変更は選択肢になりません。そうでない場合は、問題にならないでしょう。代わりに、画像を制限してみてください。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');

幅または高さに基づく制限:

https://wordpress.stackexchange.com/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' );

面積で制限すると、縦/横または横/縦のサイズを変更できます。寸法による制限の方が説明が簡単です。

3
Tom J Nowell