1) A workaround by extending the `WP_Image_Editor_GD` class
----------------------------------

The problem is how to access the image sizes before we change the quality of intermediate *jpeg* images. 


Note that the [`image_resize()`][2] function is [deprecated][3].

We can use the `jpeg_quality` filter from the public `get_quality` method of the abstract `WP_Image_Editor`  class:

    $quality = apply_filters( 'jpeg_quality', $quality, 'image_resize' );

or the `wp_editor_set_quality` filter.

Here's one idea how to set the image quality based on the image size (width/height):

    /**
     * Set image (jpeg) quality based on the image size (width/height)
     * @see http://wordpress.stackexchange.com/a/165241/26350
     */
    add_filter( 'wpse_make_image_arguments', function( $arguments, $filename, $size, $function ) 
    {   
    	// Only target jpeg cases, i.e. with the quality set in $arguments[2]       
        if( ! isset( $size['height'] ) || ! isset( $size['width'] ) || ! isset( $arguments[2] ) )
    		return $arguments;
    		
    	// Modify this part to your needs:
        if( $size['height'] <= 150  && $size['width'] <= 150 )
    		$arguments[2] = 2; // very low quality for easy testing
       
        return $arguments;
    }, 10, 4 );

where we've extended the `WP_Image_Editor_GD` class:

    /**
     * Extend the WP_Image_Editor_GD to add the custom wpse_make_image_arguments filter.
     * @see http://wordpress.stackexchange.com/a/165241/26350
     */
    add_filter( 'wp_image_editors', function( $editors ) 
    {
        // Note that the WP_Image_Editor_GD and WP_Image_Editor_Imagick classes
        // are included within this filter. So let's do the same for our extended class.

        // Our extended class that overrides the WP_Image_Editor_GD::make_image() method

    	if( ! class_exists( 'WPSE_Image_Editor_GD' ) )
    	{	
        	class WPSE_Image_Editor_GD extends WP_Image_Editor_GD
        	{
    	    	protected function make_image( $filename, $function, $arguments ) 
                {
                    // Add a custom filter		
    	    		$arguments = apply_filters( 'wpse_make_image_arguments', $arguments, $filename, $this->size, $function );

                    // Parent method
    			    return parent::make_image( $filename, $function, $arguments );
    		    }
    	    }
        }

        // Prepend the extended class to the array of image editors:    
    	array_unshift( $editors, 'WPSE_Image_Editor_GD' );

    	return $editors;
    } );

where we introduced the custom `wpse_make_image_arguments` filter.

This way we can modify the quality settings, **before** the intermediate files are saved.

Here's an example:

![Example][1]

*PS:* I didn't check out the case when the *Imagick* library is used instead, but I guess we could do something similar by extending the `WP_Image_Editor_Imagick` class.


2) Update - Set jpeg quality per image size name
-------

Here's another version where we set the jpeg quality per image size name:


    /**
     * Extend the WP_Image_Editor_GD to set quality per image size name.
     * 
     * @see http://wordpress.stackexchange.com/a/165241/26350
     */
    add_filter( 'wp_image_editors', function( $editors ) 
    {
        // Note that the WP_Image_Editor_GD and WP_Image_Editor_Imagick classes
        // are included within this filter. So let's do the same for our extended class.
    
        // Our extended class that overrides the WP_Image_Editor_GD::_resize() method
    	if( ! class_exists( 'WPSE2_Image_Editor_GD' ) )
    	{	
    		class WPSE2_Image_Editor_GD extends WP_Image_Editor_GD
    		{
    			protected function _resize( $max_w, $max_h, $crop = false )
    			{
    				$qualities = apply_filters( 'wpse_jpeg_qualities', [] );
    				$default_quality = (int) apply_filters( 'wpse_default_jpeg_quality', 82 );			    				
    				$sizes = wp_get_additional_image_sizes();
    				$this->set_quality( $default_quality );			
    				foreach( (array) $qualities as $name => $quality )
    				{
    					if( 
    						isset( $sizes[$name] ) 
    						&& (int)  $sizes[$name]['width']  === (int)  $max_w
    						&& (int)  $sizes[$name]['height'] === (int)  $max_h
    						&& (bool) $sizes[$name]['crop']   === (bool) $crop  
    					)	
    						$this->set_quality( $quality );					
    				}
    			
    				// Parent method
    				return parent::_resize( $max_w, $max_h, $crop );
    			}
    		}
    	}
    	
        // Prepend the extended class to the array of image editors:    
        array_unshift( $editors, 'WPSE2_Image_Editor_GD' );
    	
        return $editors;
    } );

I noticed that the crop arguments can be 0, false or empty, so we do some typecasting to be sure. 

Here we've introduced the following new filters:

    add_filter( 'wpse_jpeg_qualities', function( $qualities )
    { 
        return [ 'hello-image' => 2, 'medium' => 2, 'large' => 2 ];
    } );

and 

    add_filter( 'wpse_default_jpeg_quality', function( $quality )
    { 
        return 82;
    } );

that can hopefully be adjusted to your needs!

  [1]: https://i.sstatic.net/3ZIJs.jpg
  [2]: http://codex.wordpress.org/Function_Reference/image_resize
  [3]: http://codex.wordpress.org/Function_Reference/image_resize