Làm thế nào bạn có thể thiết lập chiều rộng tối đa cho hình ảnh gốc?


11

Trường hợp: Tôi có một khách hàng không biết nhiều về thế giới kỹ thuật số. Tuy nhiên, những gì cô ấy biết là làm thế nào để đưa bức ảnh từ máy ảnh của cô ấy vào máy tính và trong WordPress. Tuy nhiên, cô không biết làm thế nào để thu nhỏ kích thước ảnh xuống kích thước bình thường.

Giải pháp: Tôi thích WordPress tự động thu nhỏ kích thước của những bức ảnh đó dưới nền thành chiều rộng tối đa 1024px.

Vấn đề: Mặc dù tôi có thể đặt độ rộng tối đa trong cài đặt, tôi có thể đặt $ content_creen và tôi có thể thêm kích thước hình ảnh mới bằng 'add_image_size'. Ảnh gốc vẫn được lưu trong thư mục tải lên ở kích thước gốc. Có nghĩa là không gian ổ cứng sẽ dễ dàng có được đầy đủ.

Câu hỏi: Tôi nên đặt gì vào hàm.php để cho WordPress giảm kích thước ảnh gốc (nếu nó lớn hơn chiều rộng tối đa)?

Câu trả lời:


6

Tôi đã có thể giải quyết nó bằng mã sau đây:

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

Tệp gốc là 3,3Mb sau khi được tải lên, với kích thước lớn được đặt thành 2048x2048, chỉ mất 375Kb trên máy chủ (giảm khoảng 90%!)


1
Bạn có phiền nếu tôi sử dụng điều này trong một blogpost cùng với mã khác trong câu trả lời của tôi không?
Tom J Nowell

Nếu bạn thấy nó hữu ích, tôi không phiền, blog của bạn là gì?
Đánh dấu

Trang web của tôi là tomjn.com, tôi chưa viết bài đăng, tôi sẽ làm như vậy trong tuần tới và đăng URL ở đây khi tôi hoàn thành
Tom J Nowell

3

Thay đổi kích thước đã được thực hiện để tạo kích thước lớn / trung bình / ngón tay cái, nhưng vấn đề bạn gặp phải là hình ảnh quá lớn để thay đổi kích thước, do thiếu bộ nhớ hoặc thời gian.

Vì vậy, thay đổi kích thước không phải là một lựa chọn, nếu không, bạn sẽ không gặp vấn đề gì. Thay vào đó, hãy thử giới hạn hình ảnh, vì vậy nếu việc tải lên 20 MB xảy ra, nó sẽ bị từ chối với một thông báo cho biết rằng nó cần phải được thu nhỏ.

Giới hạn dựa trên diện tích hình ảnh / megapixel:

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

Giới hạn dựa trên chiều rộng hoặc chiều cao:

/wordpress//posts/67110/revutions

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

Giới hạn theo khu vực sẽ cho phép hình ảnh cao / mỏng hoặc rộng / ngắn có thể thay đổi kích thước, giới hạn theo kích thước có thể dễ giải thích hơn


Vâng, tôi đã suy nghĩ rất kỹ về những gì tôi muốn và những gì tôi muốn là hình ảnh gốc sẽ có cùng kích thước với kích thước được đặt thành kích thước hình ảnh 'Lớn'. Để làm điều đó tôi nghĩ rằng tôi phải kiểm tra với 'wp_handle_upload', bạn nghĩ sao?
Đánh dấu

Ah vì vậy bạn có kích thước lớn / trung bình, bạn chỉ muốn ngăn chặn bản gốc được sử dụng? Tôi nghĩ bạn có nghĩa là cô ấy đang tải lên hình ảnh lớn và phiên bản lớn luôn được sử dụng và nó không tạo ra các phiên bản nhỏ hơn?
Tom J Nowell

1
Nhưng cái móc đó nghe có vẻ đúng chỗ, hoặc thậm chí là wp_handle_upload_prefilterbộ lọc được sử dụng trong những cái tôi đã liệt kê ở trên, một số mã thay đổi kích thước PHP thay vì thêm lỗi có thể thực hiện thủ thuật miễn là bạn ghi lại vào tệp gốc. Thử nghiệm sẽ là cần thiết mặc dù
Tom J Nowell

Bạn nói đúng. Tất cả các kích thước phù hợp đang được tạo Tôi chỉ không hiểu tại sao WordPress sẽ giữ nguyên bản gốc khi kích thước đã được đặt trong trang Cài đặt. Hoặc có thể thực hiện tùy chọn đăng ký với "Giữ nguyên bản" mà bạn có thể từ chối. Chỉ 2 xu của tôi ...
Đánh dấu

1
bởi vì nó cần lưu tệp để sau đó sử dụng nó cho các kích thước khác và cần thiết nếu có bất kỳ sửa đổi nào được thực hiện hoặc tái tạo
Tom J Nowell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.