Resize Image without cropping

时间:2014-06-22 作者:Loki

目前我正在开发WordPress插件,作为插件的一部分,用户可以上传图像。我想做的是,这些上传的任何大小的图像都会被调整到100px乘以100px,而不会被裁剪。

下面是代码中进行大小调整的部分。它工作,但不是没有修剪。我希望有人能在不裁剪图像的情况下帮助完成这项工作。

最好只使用WordPress自己的函数。

$editor = wp_get_image_editor( $avatar_full_path );
if ( ! is_wp_error( $editor ) ) {
    $resized = $editor->resize( 100, 100, true );
    if ( ! is_wp_error( $resized ) ) {
        $dest_file = $editor->generate_filename();
        $saved = $editor->save( $dest_file );
        if ( ! is_wp_error( $saved ) )
            $local_avatars[$size] = str_replace( $upload_path[\'basedir\'], $upload_path[\'baseurl\'], $dest_file );
    }
}

2 个回复
SO网友:Christoph Daum

如果不想忽略原始图像比率。最简单的方法是使用add_image_size() 将$crop设置为false。

http://codex.wordpress.org/Function_Reference/add_image_size

我在wordpress文档中找到了一个示例。

http://codex.wordpress.org/Plugin_API/Filter_Reference/image_resize_dimensions

add_filter( \'image_resize_dimensions\', \'custom_image_resize_dimensions\', 10, 6 );
function custom_image_resize_dimensions( $payload, $orig_w, $orig_h, $dest_w, $dest_h, $crop ){

// Change this to a conditional that decides whether you 
// want to override the defaults for this image or not.
if( false )
    return $payload;

if ( $crop ) {
    // crop the largest possible portion of the original image that we can size to $dest_w x $dest_h
    $aspect_ratio = $orig_w / $orig_h;
    $new_w = min($dest_w, $orig_w);
    $new_h = min($dest_h, $orig_h);

    if ( !$new_w ) {
        $new_w = intval($new_h * $aspect_ratio);
    }

    if ( !$new_h ) {
        $new_h = intval($new_w / $aspect_ratio);
    }

    $size_ratio = max($new_w / $orig_w, $new_h / $orig_h);

    $crop_w = round($new_w / $size_ratio);
    $crop_h = round($new_h / $size_ratio);

    $s_x = floor( ($orig_w - $crop_w) / 2 );
    $s_y = 0; // [[ formerly ]] ==> floor( ($orig_h - $crop_h) / 2 );
} else {
    // don\'t crop, just resize using $dest_w x $dest_h as a maximum bounding box
    $crop_w = $orig_w;
    $crop_h = $orig_h;

    $s_x = 0;
    $s_y = 0;

    list( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h );
}

// if the resulting image would be the same size or larger we don\'t want to resize it
if ( $new_w >= $orig_w && $new_h >= $orig_h )
    return false;

// the return array matches the parameters to imagecopyresampled()
// int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h
return array( 0, 0, (int) $s_x, (int) $s_y, (int) $new_w, (int) $new_h, (int) $crop_w, (int) $crop_h );

}
这不是您目前需要的,但您可以通过删除用于保持图像比率的内容来轻松更改此示例。

看到上面的示例,您可能需要修改$new_w$new_h. 为两者输入硬编码100可能已经足够了。这里是更改后的最后一行。

return array( 0, 0, (int) $s_x, (int) $s_y, 100, 100, (int) $crop_w, (int) $crop_h );
希望这有帮助。

SO网友:Tom J Nowell

将图像上载到WordPress时,会发生以下情况:

检查文件并将其移动到uploads文件夹中的适当位置创建“attachment”类型的帖子。此帖子由上传文件中的元数据填充。对于定义的每个图像大小,将根据该图像大小指定的内容创建原始图像的副本引用该图像的任何代码,默认情况下,使用附件帖子ID而不是URL来执行此操作,您将获得:

原始图像文件是一个“大”图像,是一个“中”图像,是一个“缩略图”,因此您的问题在这些方面没有任何意义。您有一个XY问题,您正试图找出解决方案的解决方案。

与其尝试将图像大小调整为100x100,并得出一个全新的问题,不如问问原始问题的解决方案是什么:

"How do I display an attachment at 100x100 without cropping?"

答案在于图像系统。

在处理图像附件时,用于获取原始图像的API采用大小参数,例如:

the_post_thumbnail(\'medium\');
如果您可以指定自己的尺寸,该怎么办?API允许您传入如下数组:

the_post_thumbnail( array( 100,100 ) );
但这并没有提供100x100的图像,而是提供了现有的最接近的匹配大小,高度和宽度参数为100。它不会返回并为您调整所有内容的大小。

相反,如果我们添加一个新的图像大小,并指定它不使用裁剪,如下所示:

// add_image_size( $name, $width, $height, $crop );
add_image_size( \'Lokis100x100\', 100, 100, false );
然后执行以下操作:

the_post_thumbnail( \'Lokis100x100\' );
你应该得到你想要的。但有一件重要的事情需要注意。WordPress在上传时调整大小。您将需要重新生成这些图像或重新上载图像,以便它能够处理站点上已有的图像。有许多插件可以做到这一点,比如regen缩略图。

我在上面定义的“Lokis100x100”图像大小不会裁剪图像。这意味着如果我上传一个200x100的图像,我将得到一个100x50的图像,缩小到适合指定的尺寸。如果crop设置为true,我会得到一张100x100的图像,上面和下面都被裁剪了。

如果您以某种方式上传图像并存储其URL,这是错误的做法,您应该就此提出一个问题。我建议询问:

“上载图像文件时,我正在存储其URL。如何将其作为附件帖子ID处理?”

至于wp_get_image_editor

您的代码检查函数是否返回错误,但不尝试处理该场景

例如:

$editor = wp_get_image_editor( $avatar_full_path );
if ( ! is_wp_error( $editor ) ) {
    ...
}
如果is_wp_errortrue? 没有什么这个$editor 对象将是一个WP\\u错误对象,而不是图像编辑器,它将包含一条消息,告诉您出了什么问题,但由于您没有打印出该消息,所以您不知道它说了什么。这些消息可以非常清楚地知道发生了什么错误,例如您指定的文件不存在、无法读取或无法保存文件

结束

相关推荐

将变量从header.php传递到模板,反之亦然

我定义了一个变量,我们称之为$header_var, 放置在标题中。php文件。我希望将此变量传递到我的模板文件(在本例中为taxonomy.php)。另外,我也希望能够以另一种方式做同样的事情,比如通过$template_var 根据我的分类法。php到标题。php。这是可能的,因为在加载头之后没有声明变量吗?我试过使用global$header_var 但是没有运气。有什么建议吗?