In general I wouldn't recommend modifying the original uploaded image files, just in case we might need to re-generate intermediate sizes.

*But let's see if it's possible :-)*

We can in general let WordPress choose the image editor, that depends on modules like *GD* or *Imagick*, through:

    $editor = wp_get_image_editor( $file );

but this can return an `WP_Error` object, so we better check it with `is_wp_error( $editor )` before using it.

It's useful to let the image editor handle things through methods like `set_quality()` and `save()`. We can see such an usage example in the *Resize Image After Upload* plugin, mentioned by @MerchantWeb. This is also used by the core in various ways.

The plugin hooks into the `wp_handle_upload` filter to modify the original uploaded jpeg image files, as far as I understand it.

We could therefore use something like the following, to modify the quality of the original jpeg image file to e.g. 90%:

    /**
     * A) Modify the quality of original jpeg images to 90%
     */
    add_filter( 'wp_handle_upload', function( $data )
    {
    	if( ! isset( $data['file'] ) || ! isset( $data['type'] ) )
    		return $data;

        // Target jpeg images    	
    	if( in_array( $data['type'], [ 'image/jpg', 'image/jpeg' ] ) )
    	{
			// Check for a valid image editor
    		$editor = wp_get_image_editor( $data['file'] );    
    		if( ! is_wp_error( $editor ) )
    		{
				// Set the new image quality
    			$result = $editor->set_quality( 90 );
    
				// Re-save the original image file
    			if( ! is_wp_error( $result ) )
    				$editor->save( $data['file'] );
    		}
    	}
    	return $data;
    } );

but it looks to me that this will also affect all the intermediate sizes, because this runs **before** they are generated.

If we take a look at the `media_handle_upload()` function, we might consider hooking into the `wp_generate_attachment_metadata` filter instead, to modify the original jpeg image file, **after** the intermediate sizes have been generated?

Here's an example (*PHP 5.4+*):

    /**
     * B) Modify the quality of original jpeg images to 90%
     */
	add_filter( 'wp_generate_attachment_metadata', function( $metadata, $attachment_id ) 
	{
		$file = get_attached_file( $attachment_id );
		$type = get_post_mime_type( $attachment_id );
			
		// Target jpeg images
		if( in_array( $type, [ 'image/jpg', 'image/jpeg' ] ) )
		{
			// Check for a valid image editor
			$editor = wp_get_image_editor( $file );
			if( ! is_wp_error( $editor ) )
			{
				// Set the new image quality
				$result = $editor->set_quality( 90 );

				// Re-save the original image file
	 		    if( ! is_wp_error( $result ) )
					$editor->save( $file );
			}
		}	
		return $metadata;
	}, 10, 2 );

If we needed to restrict this further, we might wrap this into the `wp_handle_upload` hook as well and check for the relevant *action* context, like *wp_handle_upload* or *sideload*.

We might also need to set the quality very low while testing, just to see if it worked ;-)

**Note**: These are only demos, that would need further testing.

**Update:** Just did some simple testing. Here we can see that when the full size image is re-saved at %1 quality then all the intermediate sizes (300x200 and 150x150) in:

 - A) are also at low quality. 
 - B) are not affected.


[![a)][1]][1]


[![b)][2]][2]


  [1]: https://i.sstatic.net/P1KBa.jpg
  [2]: https://i.sstatic.net/zmrpi.jpg