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


11

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

解決策: WordPressで、背景の写真を最大幅1024pxに自動的に縮小します。

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

質問: WordPressで元の画像を縮小するには(functions.phpに何を入れればよいですか(最大幅より大きい場合))?

回答:


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ノーウェル

あなたがそれが便利だと思うなら、私は気にしません、あなたのブログは何ですか?
マーク

私のサイトの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が元のサイズを維持する理由がわかりません。または、オプトアウトできる「Keep Original」でチェックインオプションを作成することもできます。ちょうど私の2セント...
マーク

1
他のサイズで使用するためにファイルを保存する必要があり、変更または再生成が行われた場合に必要になるため
Tom J Nowell
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.