คุณจะตั้งค่าความกว้างสูงสุดสำหรับภาพต้นฉบับได้อย่างไร


11

กรณี: ฉันมีลูกค้าที่ไม่รู้จักโลกดิจิตอลมากนัก อย่างไรก็ตามสิ่งที่เธอรู้ก็คือการถ่ายภาพจากกล้องของเธอไปยังคอมพิวเตอร์และใน WordPress อย่างไรก็ตามเธอไม่ทราบวิธีลดขนาดรูปภาพให้เป็นขนาดปกติ

วิธีแก้ปัญหา: ฉันชอบ WordPress เพื่อลดขนาดรูปภาพเหล่านั้นโดยอัตโนมัติในพื้นหลังเป็นความกว้างสูงสุด 1024px

ปัญหา: แม้ว่าฉันสามารถตั้งค่าความกว้างสูงสุดในการตั้งค่าฉันสามารถตั้ง $ content_width และฉันสามารถเพิ่มขนาดภาพใหม่ด้วย 'add_image_size' ภาพถ่ายต้นฉบับจะยังคงเก็บไว้ในโฟลเดอร์อัพโหลดในขนาดดั้งเดิม ความหมายของพื้นที่ว่างบนฮาร์ดดิสก์จะทำให้เต็มได้อย่างง่ายดาย

คำถาม: ฉันควรใส่ function.php อะไรเพื่อให้ WordPress ลดขนาดภาพต้นฉบับ (ถ้ามันใหญ่กว่านั้นคือความกว้างสูงสุด)

คำตอบ:


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
คุณจะรังเกียจไหมถ้าฉันใช้มันใน blogpost ข้างๆรหัสอื่นในคำตอบของฉัน
Tom J Nowell

หากคุณพบว่ามีประโยชน์ฉันไม่คิดว่าบล็อกของคุณคืออะไร
ทำเครื่องหมาย

เว็บไซต์ของฉัน 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' คุณคิดอย่างไร
ทำเครื่องหมาย

อ่าคุณมีขนาดใหญ่ / กลางคุณแค่ต้องการป้องกันไม่ให้ใช้งานต้นฉบับ? ฉันคิดว่าคุณหมายถึงเธอกำลังอัปโหลดภาพขนาดใหญ่และมีการใช้ภาพขนาดใหญ่อยู่ตลอดเวลา
Tom J Nowell

1
แต่เสียงนั้นเกี่ยวกับสถานที่ที่ถูกต้องหรือแม้แต่wp_handle_upload_prefilterตัวกรองที่ใช้ในรายการที่ฉันระบุไว้ข้างต้นบางรหัสการปรับขนาด PHP แทนที่จะเพิ่มข้อผิดพลาดอาจทำเคล็ดลับตราบใดที่คุณเขียนกลับไปที่ไฟล์ต้นฉบับ การทดสอบจะต้องแม้ว่า
Tom J Nowell

คุณถูก. ขนาดที่เหมาะสมทั้งหมดถูกสร้างขึ้นฉันไม่เข้าใจว่าทำไม WordPress จะเก็บต้นฉบับไว้เมื่อตั้งค่ามิติในหน้าการตั้งค่า หรืออาจเลือกใช้การเช็คอินด้วย "Keep Original" ซึ่งคุณสามารถเลือกไม่ใช้ได้ แค่ 2 เซ็นต์ของฉัน ...
Mark

1
เพราะมันจำเป็นต้องบันทึกไฟล์เพื่อที่จะใช้มันสำหรับขนาดอื่น ๆ และมันก็จำเป็นถ้ามีการแก้ไขหรือการฟื้นฟู
Tom J Nowell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.