Cách thêm nhiều kích thước hình ảnh có cùng kích thước với add_image_size


8

Tôi đang sử dụng bộ lọc thang độ xám trên tất cả các hình ảnh được tải lên trong cài đặt WordPress của mình. Tuy nhiên tôi muốn cả hình ảnh tỷ lệ xám và hình ảnh màu trong trang web của tôi (được tô màu khi di chuột). Cách tôi đã cố gắng để làm điều này là tạo ra một loạt các add_image_size () giống như vậy:

add_image_size( 'gho-small', 100, 0, true ); // Used for small images
add_image_size( 'gho-small-grayscale', 100, 0, true ); // Used for small grayscaled images
add_image_size( 'gho-medium', 200, 0, true ); // Used for medium images
add_image_size( 'gho-medium-grayscale', 200, 0, true ); // Used for medium grayscaled images
add_image_size( 'gho-large', 400, 0, true ); // Used for large images
add_image_size( 'gho-large-grayscale', 400, 0, true ); // Used for large grayscaled images

Và sau đó tôi sẽ thực hiện một bộ lọc trên các hình ảnh và chỉ lấy ID * -grayscale và lưu chúng:

add_filter('wp_generate_attachment_metadata','gholumns_grayscale_filter');
function gholumns_grayscale_filter($meta)
{
    $dir = wp_upload_dir();
    $file = trailingslashit($dir['path']).$meta['sizes']['gho-large-grayscale']['file'];
    do_grayscale_filter($file);
    return $meta;
}

Nó sẽ hoạt động tốt, nhưng rõ ràng add_image_size () xem xét các đối số chiều rộng và chiều cao và khi một kích thước đã được xác định với sự kết hợp đó, kích thước không được thêm vào. Tôi có thể hiểu rằng, vì chức năng là để thêm kích thước mới, và nếu kích thước là trùng lặp, thông thường tốt hơn là không thêm nó một lần nữa để tiết kiệm thời gian xử lý. Nhưng bây giờ tôi muốn hai hình ảnh có cùng kích thước, nhưng một hình ảnh có bộ lọc được áp dụng cho nó và hình ảnh kia là bản gốc.

Làm thế nào tôi có thể đạt được điều này?

Tôi đã cố gắng thêm kích thước khác chỉ rộng hơn một pixel, như:

add_image_size( 'gho-small-grayscale', 101, 0, true ); // Used for small grayscaled images

Và sau đó thay đổi kích thước hình ảnh sau này sau khi bộ lọc trở lại 100/200/400bất cứ điều gì. Nhưng nó không cảm thấy đúng, và nó cũng làm rối get_the_post_thumbnail()các cuộc gọi vì người ta vẫn nghĩ rằng kích thước hình ảnh là 101x$height. Nó cũng không đơn giản như thay đổi kích thước hình ảnh trở lại theo một pixel theo chiều ngang và chiều dọc vì tỷ lệ có thể khiến chiều > 1pxcao cao hơn khi bạn có chiều rộng + 1px.


Coen, bạn nên đăng giải pháp của bạn như là một câu trả lời. Kiểm tra Câu hỏi thường gặp và bạn sẽ thấy việc trả lời câu hỏi của mình là ổn.
brasofilo

1
@brasofilo vâng tôi biết nhưng tại thời điểm đó tôi không đủ uy tín để trả lời câu hỏi của chính mình trong vòng 24h sau khi đăng nó. Thông thường tôi làm điều đó, đừng lo lắng.
Coen

Rất tiếc ... đã đến lúc tôi quay lại FAQ và đọc phần danh tiếng đó. Mã mẫu tuyệt vời trong Hỏi & Đáp của bạn và cảm ơn về phản hồi tốt :)
brasofilo

Câu trả lời:


9

Gee, tôi tiếp tục giải quyết vấn đề của riêng tôi mọi lúc. Đây là cách tôi giải quyết nó cuối cùng. Tôi phát hiện ra rằng add_image_size không bỏ qua các kích thước giống hệt nhau của kích thước hình ảnh, mà thay vào đó, chỉ tên tệp về cùng một tệp trong thư mục tải lên. Khi tôi biết điều đó, tôi chỉ có thể lưu hình ảnh thang độ xám dưới một tên khác, trả lại tên đó cho mảng $ meta trong hook của mình và WP lấy đó làm thông tin để lưu trữ trong cơ sở dữ liệu. Tất cả các hàm get_thumbnail () vẫn hoạt động như bình thường và tôi chỉ có thể yêu cầu ID -grayscale.

add_filter('wp_generate_attachment_metadata','gholumns_grayscale_filter');
function gholumns_grayscale_filter($meta)
{
$file = $meta['sizes']['gho-large-grayscale']['file'];
$meta['sizes']['gho-large-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
$file = $meta['sizes']['gho-medium-grayscale']['file'];
$meta['sizes']['gho-medium-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
$file = $meta['sizes']['gho-small-grayscale']['file'];
$meta['sizes']['gho-small-grayscale']['file'] = do_grayscale_filter($file);
//do_resize($file, -1, -1); # No longer necessary!
return $meta;
}


function do_grayscale_filter($file)
{
$dir = wp_upload_dir();
$image = wp_load_image(trailingslashit($dir['path']).$file);
imagefilter($image, IMG_FILTER_GRAYSCALE);
return save_modified_image($image, $file, '-grayscale');
}

function save_modified_image($image, $filename, $suffix)
{
$dir = wp_upload_dir();
$dest = trailingslashit($dir['path']).$filename;

list($orig_w, $orig_h, $orig_type) = @getimagesize($dest);

$filename = str_ireplace(array('.jpg', '.jpeg', '.gif', '.png'), array($suffix.'.jpg', $suffix.'.jpeg', $suffix.'.gif', $suffix.'.png'), $filename);
$dest = trailingslashit($dir['path']).$filename;

switch ($orig_type)
{
    case IMAGETYPE_GIF:
        imagegif( $image, $dest );
        break;
    case IMAGETYPE_PNG:
        imagepng( $image, $dest );
        break;
    case IMAGETYPE_JPEG:
        imagejpeg( $image, $dest );
        break;
}

return $filename;
}

Điều này thật tuyệt, và chính xác là những gì tôi muốn làm nhưng với hiệu ứng nhân chế độ pha trộn photoshop thay thế. Tôi đã có mã để tạo thành công một hình ảnh màu đỏ nhân lên từ một hình ảnh khác trong PHP thông thường, nhưng tôi không thể tìm ra cách áp dụng nó cho tất cả các kích thước hình ảnh hiện tại.
Mike Kormendy

Một điều tôi nhận thấy là điều này không hoàn toàn hiệu quả đối với các trình tái tạo hình ảnh và hình ảnh không được lưu trữ trong tháng hiện tại cho các bài đăng.
Mike Kormendy
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.