Index: wp-includes/class-wp-image-editor-gd.php
===================================================================
--- wp-includes/class-wp-image-editor-gd.php	(revision 28233)
+++ wp-includes/class-wp-image-editor-gd.php	(working copy)
@@ -383,8 +383,23 @@
 			if ( function_exists('imageistruecolor') && ! imageistruecolor( $image ) )
 				imagetruecolortopalette( $image, false, imagecolorstotal( $image ) );
 
-			if ( ! $this->make_image( $filename, 'imagepng', array( $image, $filename ) ) )
+			/*
+			 * Convert quality (1-100) to a valid compression value (0-9)
+			 * -1 = use default zlib compression
+			 *  0 = no compression
+			 *  1 = worst compression
+			 *  9 = best compression
+			 */
+			$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') );
+			}
 		}
 		elseif ( 'image/jpeg' == $mime_type ) {
 			if ( ! $this->make_image( $filename, 'imagejpeg', array( $image, $filename, $this->quality ) ) )
Index: wp-includes/class-wp-image-editor.php
===================================================================
--- wp-includes/class-wp-image-editor.php	(revision 28233)
+++ wp-includes/class-wp-image-editor.php	(working copy)
@@ -244,6 +244,20 @@
 			if ( $quality == 0 ) {
 				$quality = 1;
 			}
+		} elseif ( 'image/png' == $mime_type ) {
+			/**
+			 * Filter the PNG compression level.
+			 *
+			 * The filter is evaluated under two contexts: 'image_resize', and 'edit_image',
+			 * (when a PNG image is saved to file).
+			 *
+			 * @since 4.0.0
+			 *
+			 * @param int    $quality Compression level, between 1 (worst compression)
+			 *                        and 100 (best but slowest compression).
+			 * @param string $context Context of the filter.
+			 */
+			$quality = apply_filters( 'png_compression_level', $quality, 'image_resize' );
 		}
 
 		if ( ( $quality >= 1 ) && ( $quality <= 100 ) ){
