基于图像大小的图像质量

时间:2014-03-21 作者:nocksock

是否可以根据图像大小设置图像质量?我希望对于较大的图像(80)有更好的图像质量,对于较小的缩略图(30)有更差的图像质量。

我希望在处有一个参数add_size 要控制这一点——但根本没有。

如果重要的话:我正在使用ImageMagick。

2 个回复
SO网友:Otto

设置质量真正重要的唯一时间是在图像保存或流式传输之前(对于编辑器)。这两个都有“image\\u editor\\u save\\u pre”过滤器,将其传递给图像编辑器的实例。因此,您可以使用它以任何方式修改图像,包括设置质量。

因此,像这样的工作应该简单易行:

add_filter(\'image_editor_save_pre\',\'example_adjust_quality\');
function example_adjust_quality($image) {
    $size = $image->get_size();
    // Values are $size[\'width\'] and $size[\'height\']. Based on those, do what you like. Example:
    if ( $size[\'width\'] <= 100 ) {
        $image->set_quality(30);
    }
    if ( $size[\'width\'] > 100 && $size[\'width\'] <= 300 ) {
        $image->set_quality(70);
    }
    if ( $size[\'width\'] > 300 ) {
        $image->set_quality(80);
    }
    return $image;
}

SO网友:kaiser

预先注意:下面的答案还没有完成,也没有测试,但我没有足够的时间,所以我将把它作为草稿留在这里。可能需要第二双眼睛的是质量方法和version_compare().

首先,我们需要一个切入点。在阅读make post 同样,我认为最好是在图像编辑器保存新创建的图像之前跳进去。这是一个微控制器,在连接到image_editor_save_pre 并加载一个类,该类将遍历回调中定义的设置wpse_jpeg_quality. 它只返回jpeg_quality 在图像编辑器中运行的过滤器。

<?php

namespace WPSE;

/**
 * Plugin Name: (#138751) JPEG Quality Router
 * Author:      Franz Josef Kaiser
 * Author URI:  http://unserkaiser.com
 * License:     CC-BY-SA 2.5
 */

add_filter( \'image_editor_save_pre\', \'WPSE\\JPEGQualityController\', 20, 2 );
/**
 * @param string $image
 * @param int $post_id
 * @return string
 */
function JPEGQualityController( $image, $post_id )
{
    $config = apply_filters( \'wpse_jpeg_quality\', array(
        # Valid: <, lt, <=, le, >, gt, >=, ge, ==, =, eq
        \'limit\'      => \'gt\',
        # Valid: h, w
        \'reference\'  => \'w\',
        \'breakpoint\' => 50,

        \'low\'        => 80,
        \'high\'       => 100,
    ) );
    include_once plugin_dir_path( __FILE__ ).\'worker.php\';
    new \\WPSE\\JPEGQualityWorker( $image, $config );

    return $image;
}
实际工人是JPEGQualityWorker 班它与上面的主插件文件位于同一目录中,名为worker.php (或者您更改上面的控制器)。

它检索图像和您的设置,然后将回调添加到jpeg_quality 滤器is的功能是

检索图像参考(宽度或高度)

  • 质疑决定在哪里切换低质量/压缩比和高质量/压缩比的断点
  • 检索原始图像大小
  • 决定返回什么质量
    • 断点和限制是决定高低的关键,如上所述,这可能需要更多的关注。

      <?php
      
      namespace WPSE;
      
      /**
       * Class JPEGQualityWorker
       * @package WPSE
       */
      class JPEGQualityWorker
      {
          protected $config, $image;
          /**
           * @param string $image
           * @param array $config
           */
          public function __construct( Array $config, $image )
          {
              $this->config = $config;
              $this->image  = $image;
      
              add_filter( \'jpeg_quality\', array( $this, \'setQuality\' ), 20, 2 );
          }
      
          /**
           * Return the JPEG compression ratio.
           *
           * Avoids running in multiple context, as WP runs the function multiple
           * times per resize/upload/edit task, which leads to over compressed images.
           *
           * @param int $compression
           * @param string $context Context: edit_image/image_resize/wp_crop_image
           * @return int
           */
          public function setQuality( $compression, $context )
          {
              if ( in_array( $context, array(
                  \'edit_image\',
                  \'wp_crop_image\',
              ) ) )
                  return 100;
      
              $c = $this->getCompression( $this->config, $this->image );
      
              return ! is_wp_error( $c )
                  ? $c
                  : 100;
          }
      
          /**
           * @param array $config
           * @param string $image
           * @return int|string|\\WP_Error
           */
          public function getCompression( Array $config, $image )
          {
              $reference = $this->getReference( $config );
              if ( is_wp_error( $reference ) )
                  return $reference;
              $size = $this->getOriginalSize( $image, $reference );
              if ( is_wp_error( $size ) )
                  return $size;
      
              return $this->getQuality( $config, $size );
          }
      
          /**
           * Returns the quality set for the current image size.
           * If
           * @param array $config
           * @param int $size
           */
          protected function getQuality( Array $config, $size )
          {
              $result = version_compare( $config[\'breakpoint\'], $size );
              return (
                  0 === $result
                  AND in_array( $config[\'limit\'], array( \'>\', \'gt\', \'>=\', \'ge\', \'==\', \'=\', \'eq\' ) )
                  ||
                  1 === $result
                  AND in_array( $config[\'limit\'], array( \'<\', \'lt\', \'<=\', \'le\', ) )
              )
                  ? $config[\'high\']
                  : $config[\'low\'];
          }
      
          /**
           * Returns the reference size (width or height).
           *
           * @param array $config
           * @return string|\\WP_Error
           */
          protected function getReference( Array $config )
          {
              $r = $config[\'reference\'];
              return ! in_array( $r, array( \'w\', \'h\', ) )
                  ? new \\WP_Error(
                      \'wrong-arg\',
                      sprintf( \'Wrong argument for "reference" in %s\', __METHOD__ )
                  )
                  : $r;
          }
      
          /**
           * Returns the size of the original image (width or height)
           * depending on the reference.
           *
           * @param string $image
           * @param string $reference
           * @return int|\\WP_Error
           */
          protected function getOriginalSize( $image, $reference )
          {
              $size = \'h\' === $reference
                  ? imagesy( $image )
                  : imagesx( $image );
      
              # @TODO Maybe check is_resource() to see if we got an image
              # @TODO Maybe check get_resource_type() for a valid image
              # @link http://www.php.net/manual/en/resource.php
      
              return ! $size
                  ? new \\WP_Error(
                      \'image-failure\',
                      sprintf( \'Resource failed in %s\', get_class( $this ) )
                  )
                  : $size;
          }
      }
      

    结束

    相关推荐

    Link images to post

    将图像链接到帖子。大家好我相信这很简单,但我不知道怎么做。我知道如何在帖子中添加图像-单击帖子,添加媒体,选择缩略图。这给了我一个缩略图。我想我要做的是将缩略图链接到帖子,这样我就可以控制缩略图在页面上的显示位置。我有一个这样的模板。 <div class=\"content_div\"> <?php $car_args = array( \'post_type\' =>