Orijinal görüntüler için maksimum genişliği nasıl ayarlayabilirsiniz?


11

Vaka: Dijital dünya hakkında çok şey bilmeyen bir müşterim var. Ancak bildiği şey, fotoğrafın kamerasından bilgisayara ve WordPress'e nasıl getirileceğidir. Ancak fotoğrafın normal boyutuna nasıl küçültebileceğini bilmiyor.

Çözüm: WordPress'in arka plandaki bu fotoğrafları otomatik olarak maksimum 1024 piksel genişliğe küçültmesini seviyorum.

Sorun: Ayarlarda maksimum genişliği ayarlayabilsem de, $ content_width öğesini ayarlayabilirim ve 'add_image_size' ile yeni görüntü boyutları ekleyebilirim. Orijinal fotoğraf, yükleme klasöründe orijinal boyutunda saklanır. Yani sabit disk alanı kolayca doldurulacaktır.

Soru: WordPress'in orijinal görüntüyü küçültmesine izin vermek için function.php dosyasına ne koymalıyım (maksimum genişlikten büyükse)?

Yanıtlar:


6

Aşağıdaki kodu kullanarak çözmeyi başardı:

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' );

Orijinal dosya yüklendikten sonra 3,3Mb idi, büyük boyutlar 2048x2048 olarak ayarlandı, sunucuda sadece 375Kb aldı (yaklaşık% 90 azalma!)


1
Cevabımdaki diğer kodun yanında bir blog yazısında kullanmamın bir sakıncası var mı?
Tom J Nowell

Yararlı bulursanız, sorun değil, blogunuz nedir?
Mark

Sitemin tomjn.com, henüz yazıyı yazmadım, önümüzdeki hafta yapacağım ve bittiğinde URL'yi buraya
göndereceğim

3

Yeniden boyutlandırma, büyük / orta / başparmak boyutlarını oluşturmak için zaten yapılmıştır, ancak karşılaştığınız sorun, bellek veya zaman eksikliği nedeniyle görüntünün yeniden boyutlandırılamayacak kadar büyük olmasıdır.

Bu yüzden yeniden boyutlandırma bir seçenek değildir, eğer olmasaydı sorununuz olmazdı. Bunun yerine, görüntüleri sınırlamayı deneyin, bu nedenle 20 MB'lık bir yükleme gerçekleşirse, küçültülmesi gerektiğini belirten bir mesajla reddedilir.

Görüntü alanı / megapiksel bazında sınırlama:

<?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');

Genişlik veya yüksekliğe göre sınırlama:

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' );

Bölgeye göre sınırlama, yeniden boyutlandırılabilen uzun / ince veya geniş / kısa resimlere izin verir, boyutlarla sınırlamanın açıklanması daha kolay olabilir


İstediğim ve istediğim şeyde çok düşündüm, orijinal görüntü 'Büyük' ​​görüntü boyutuna ayarlanan boyutla aynı boyutta olacak. Bunu yapmak için 'wp_handle_upload' ile kontrol etmem gerektiğini düşünüyorum.
Mark

Ah böylece büyük / orta boyutlara sahipsiniz, sadece orijinalin kullanılmasını önlemek mi istiyorsunuz? Büyük resimler yüklediğini ve büyük sürümün her zaman kullanıldığını ve daha küçük sürümleri oluşturduğunu kastettiğinizi düşündüm.
Tom J Nowell

1
Ancak bu kanca doğru yer hakkında, hatta wp_handle_upload_prefilteryukarıda listelediklerimde kullanılan filtre hakkında, bir hata eklemek yerine bazı PHP yeniden boyutlandırma kodu, orijinal dosyaya geri yazdığınız sürece hile yapabilir. Yine de test gerekli olacaktır
Tom J Nowell

Haklısın. Tüm uygun boyutlar oluşturuluyor Boyutlar Ayarlar sayfasında ayarlandığında WordPress'in neden orijinali koruyacağını anlamıyorum. İsterseniz "Orijinali Koru" seçeneğiyle de çıkış yapabilirsiniz. Sadece 2 sentim ...
Mark

1
çünkü dosyayı diğer boyutlar için kullanmak için kaydetmesi gerekiyor ve herhangi bir değişiklik veya yenileme yapılması gerekiyorsa
Tom J Nowell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.