Index: wp-includes/class-wp-image-editor-gd.php
===================================================================
--- wp-includes/class-wp-image-editor-gd.php	(revision 28687)
+++ wp-includes/class-wp-image-editor-gd.php	(working copy)
@@ -384,11 +384,19 @@
 				imagetruecolortopalette( $image, false, imagecolorstotal( $image ) );
 
 			/*
-			 * Invert the 1-100 quality scale and constrain it to 0-9,
-			 * as per imagepng()'s peculiar quality parameter.
+			 * Convert quality (1-100) to a valid compression value (0-9)
+			 *  0 = no compression
+			 *  1 = worst compression
+			 *  9 = best compression
+			 * -1 = use default zlib compression
 			 */
-			$compression_level = floor( ( 101 - $this->quality ) * 0.09 );
+			$compression_level = floor( $this->quality / 10 );
 
+			if ( $compression_level > 9 ) {
+				$compression_level = 9;
+			} elseif ( -1 != $compression_level && $compression_level < 0 ) {
+				$compression_level = 0;
+			}
 			if ( ! $this->make_image( $filename, 'imagepng', array( $image, $filename, $compression_level ) ) ) {
 				return new WP_Error( 'image_save_error', __('Image Editor Save Failed') );
 			}
Index: wp-includes/class-wp-image-editor.php
===================================================================
--- wp-includes/class-wp-image-editor.php	(revision 28687)
+++ wp-includes/class-wp-image-editor.php	(working copy)
@@ -244,7 +244,17 @@
 			if ( $quality == 0 ) {
 				$quality = 1;
 			}
-		}
+		} elseif ( 'image/png' == $this->mime_type ) {
+			/**
+			 * Filter the PNG compression level.
+			 *
+			 * @since 4.0.0
+			 *
+			 * @param int    $quality Compression level, between 1 (worst compression)
+			 *                        and 100 (best but slowest compression).
+			 */
+			$quality = apply_filters( 'png_compression_level', $quality );
+ 		}
 
 		if ( ( $quality >= 1 ) && ( $quality <= 100 ) ){
 			$this->quality = $quality;
