이미지 크기에 따른 이미지 품질


15

이미지 크기에 따라 이미지 품질을 설정할 수 있습니까? 큰 이미지 (80)의 경우 더 나은 이미지 품질을 원하고 작은 축소판 (30)의 경우 더 나쁜 이미지 품질을 원합니다.

나는 그것을 add_size제어하기 위한 매개 변수를 기대 했지만 아무것도 없습니다.

중요한 경우 : ImageMagick을 사용하고 있습니다.

답변:


15

품질을 실제로 설정하는 유일한 시간은 이미지를 저장하거나 스트리밍하기 직전입니다 (편집기). 둘 다 "image_editor_save_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;
}

이 이미지 (+1)만큼 똑바로 무언가를 사용하지 않은 이유는, 일부 이미지 (회전, 자르기 등)를 편집 할 때 모든 작업이 두 번 호출되어 품질이 두 배로 감소한 것입니다. 여전히 "인스턴스 WP_Image_Editor"부분은 내가 쓴 것보다 훨씬 더 많은 해결책입니다.
kaiser

1
품질은 백분율이 아닌 정확한 값입니다. 저장 될 때까지 원하는대로 설정하고 재설정 할 수 있습니다. 100 번에 100 번 설정하면 10시에 떠납니다.
Otto

나는 그것이 사이에 저장할 것이라고 생각했다. 고마워요
카이저

나에게 전화 image_editor_save_pre하지 않는 것 같습니다 . error_log(확실히 작동하는)을 사용하여 물건을 출력하려고하면 출력 이 없습니다. : /
Nils Riedemann

1
이미지를 다시 저장하면 재생도 작동 할 수 있습니다. 실제로 파일을 다시로드하고 다시 저장하는 조치를 취하지 않으면 코드가 시스템의 기존 파일을 변경하지 않습니다.
Otto

5

선결제 참고 : 아래 답변은 완료되지 않았으며 테스트를 거치지 않았지만 시간이 충분하지 않으므로 여기에 초안을 남겨 두겠습니다. 아마도 두 번째 쌍의 눈이 필요한 것은의 품질 방법과 해석입니다 version_compare().

먼저 진입 점이 필요합니다. make post를 다시 읽은 후에 Image Editor가 새로 만든 이미지를 저장하기 전에 뛰어 들어가는 것이 가장 좋을 것이라고 생각했습니다. 다음은 콜백에 연결되어 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필터에 콜백을 추가합니다 . 무엇입니까

  • 이미지 참조 (가로 또는 세로) 검색
  • 저품질 / 고압축 비율 사이에서 전환 할 위치를 결정하는 중단 점에 대한 질문
  • 원본 이미지 크기 검색
  • 반환 할 품질 결정

중단 점과 한계는 높음과 낮음 사이에서 결정되는 것이며 위에서 언급했듯이 더 많은 사랑이 필요할 수 있습니다.

<?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;
    }
}

아직도 노력하고 있습니까? 내가 염려하는 한 플러그인으로보고 싶습니다.
Nils Riedemann

미안하지만 난 아니야 플러그인으로도보고 싶지만 현재 필요하지 않고 시간이 없기 때문에 지금까지는 일어나지 않을 것입니다. 어쩌면 샷을 주거나 편집 또는 별도의 답변을 얼마나 멀리 가져 와서 제출했는지 확인하십시오 . :)
kaiser

kaiser : 당신은 그것을 너무 복잡하게 생각합니다. image_editor_save_pre로 전송 된 $ image는 WP_Image_Editor 클래스의 인스턴스입니다. 그것은 크기를 얻고 품질과 그 안에 이미있는 모든 것을 설정하는 기능을 가지고 있습니다. 그들에게 전화하면됩니다.
Otto
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.