wp_image_editor

The timeline below displays how wordpress function wp_image_editor has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.4

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int          $post_id Attachment post ID.
 * @param false|object $msg     Optional. Message to display for image editor updates or errors.
 *                              Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 600) ? 600 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = wp_basename($meta['file']) !== $backup_sizes['full-orig']['file'];
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='notice notice-error' role='alert'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='notice notice-success' role='alert'><p>{$msg->msg}</p></div>";
        }
    }
    /**
     * Shows the settings in the Image Editor that allow selecting to edit only the thumbnail of an image.
     *
     * @since 6.3.0
     *
     * @param bool $show Whether to show the settings in the Image Editor. Default false.
     */
    $edit_thumbnails_separately = (bool) apply_filters('image_edit_thumbnails_separately', false);
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">
	<?php 
    echo $note;
    ?>
	<div class="imgedit-panel-content imgedit-panel-tools wp-clearfix">
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.toggleCropTool( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this );" aria-expanded="false" aria-controls="imgedit-crop" class="imgedit-crop button disabled" disabled><?php 
    esc_html_e('Crop');
    ?></button>
			<button type="button" class="imgedit-scale button" onclick="imageEdit.toggleControls(this);" aria-expanded="false" aria-controls="imgedit-scale"><?php 
    esc_html_e('Scale');
    ?></button>
			<div class="imgedit-rotate-menu-container">
				<button type="button" aria-controls="imgedit-rotate-menu" class="imgedit-rotate button" aria-expanded="false" onclick="imageEdit.togglePopup(this)" onblur="imageEdit.monitorPopup()"><?php 
    esc_html_e('Image Rotation');
    ?></button>
				<div id="imgedit-rotate-menu" class="imgedit-popup-menu">
			<?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536.
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
					<button type="button" class="imgedit-rleft button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" onblur="imageEdit.monitorPopup()"><?php 
        esc_html_e('Rotate 90&deg; left');
        ?></button>
					<button type="button" class="imgedit-rright button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" onblur="imageEdit.monitorPopup()"><?php 
        esc_html_e('Rotate 90&deg; right');
        ?></button>
					<button type="button" class="imgedit-rfull button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate(180, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" onblur="imageEdit.monitorPopup()"><?php 
        esc_html_e('Rotate 180&deg;');
        ?></button>
				<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
					<button type="button" class="imgedit-rleft button disabled" disabled></button>
					<button type="button" class="imgedit-rright button disabled" disabled></button>
				<?php 
    }
    ?>
					<hr />
					<button type="button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" onblur="imageEdit.monitorPopup()" class="imgedit-flipv button"><?php 
    esc_html_e('Flip vertical');
    ?></button>
					<button type="button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" onblur="imageEdit.monitorPopup()" class="imgedit-fliph button"><?php 
    esc_html_e('Flip horizontal');
    ?></button>
					<?php 
    echo $note_no_rotate;
    ?>
				</div>
			</div>
		</div>
		<div class="imgedit-submit imgedit-menu">
			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><?php 
    esc_html_e('Undo');
    ?></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><?php 
    esc_html_e('Redo');
    ?></button>
			<button type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn"><?php 
    esc_html_e('Cancel Editing');
    ?></button>
			<button type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn"><?php 
    esc_html_e('Save Edits');
    ?></button>
		</div>
	</div>

	<div class="imgedit-panel-content wp-clearfix">
		<div class="imgedit-tools">
			<input type="hidden" id="imgedit-nonce-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $nonce;
    ?>" />
			<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
			<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
			<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
			<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
			<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
			<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

			<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
			<div class="imgedit-crop-grid"></div>
			<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')"
				src="<?php 
    echo esc_url(admin_url('admin-ajax.php', 'relative')) . '?action=imgedit-preview&amp;_ajax_nonce=' . $nonce . '&amp;postid=' . $post_id . '&amp;rand=' . rand(1, 99999);
    ?>" alt="" />
			</div>
		</div>
		<div class="imgedit-settings">
			<div class="imgedit-tool-active">
				<div class="imgedit-group">
				<div id="imgedit-scale" tabindex="-1" class="imgedit-group-controls">
					<div class="imgedit-group-top">
						<h2><?php 
    _e('Scale Image');
    ?></h2>
						<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
						<?php 
    /* translators: Hidden accessibility text. */
    esc_html_e('Scale Image Help');
    ?>
						</span></button>
						<div class="imgedit-help">
						<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
						</div>
						<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
						<p>
							<?php 
        printf(
            /* translators: %s: Image width and height in pixels. */
            __('Original dimensions %s'),
            '<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
        );
        ?>
						</p>
						<?php 
    }
    ?>
						<div class="imgedit-submit">
						<fieldset class="imgedit-scale-controls">
							<legend><?php 
    _e('New dimensions:');
    ?></legend>
							<div class="nowrap">
							<label for="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
							<?php 
    /* translators: Hidden accessibility text. */
    _e('scale height');
    ?>
							</label>
							<input type="number" step="1" min="0" max="<?php 
    echo isset($meta['width']) ? $meta['width'] : '';
    ?>" aria-describedby="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>"  id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
							<span class="imgedit-separator" aria-hidden="true">&times;</span>
							<label for="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale height');
    ?></label>
							<input type="number" step="1" min="0" max="<?php 
    echo isset($meta['height']) ? $meta['height'] : '';
    ?>" aria-describedby="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
							<button id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary"><?php 
    esc_html_e('Scale');
    ?></button>
							<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>"><span class="dashicons dashicons-warning" aria-hidden="true"></span><?php 
    esc_html_e('Images cannot be scaled to a size larger than the original.');
    ?></span>
							</div>
						</fieldset>
						</div>
					</div>
				</div>
			</div>

		<?php 
    if ($can_restore) {
        ?>
				<div class="imgedit-group">
				<div class="imgedit-group-top">
					<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link" aria-expanded="false"><?php 
        _e('Restore original image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
					<div class="imgedit-help imgedit-restore">
					<p>
					<?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?>
					</p>
					<div class="imgedit-submit">
						<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
					</div>
				</div>
			</div>
			</div>
		<?php 
    }
    ?>
			<div class="imgedit-group">
				<div id="imgedit-crop" tabindex="-1" class="imgedit-group-controls">
				<div class="imgedit-group-top">
					<h2><?php 
    _e('Crop Image');
    ?></h2>
					<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('Image Crop Help');
    ?>
					</span></button>
					<div class="imgedit-help">
						<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>
						<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
						<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

						<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
						<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
					</div>
				</div>
				<fieldset class="imgedit-crop-ratio">
					<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
					<div class="nowrap">
					<label for="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('crop ratio width');
    ?>
					</label>
					<input type="number" step="1" min="1" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
					<span class="imgedit-separator" aria-hidden="true">:</span>
					<label for="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('crop ratio height');
    ?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
					</div>
				</fieldset>
				<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
					<legend><?php 
    _e('Selection:');
    ?></legend>
					<div class="nowrap">
					<label for="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('selection width');
    ?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
					<span class="imgedit-separator" aria-hidden="true">&times;</span>
					<label for="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('selection height');
    ?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
					</div>
				</fieldset>
				<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
					<legend><?php 
    _e('Starting Coordinates:');
    ?></legend>
					<div class="nowrap">
					<label for="imgedit-start-x-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('horizontal start position');
    ?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-start-x-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" value="0" />
					<span class="imgedit-separator" aria-hidden="true">&times;</span>
					<label for="imgedit-start-y-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('vertical start position');
    ?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-start-y-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" value="0" />
					</div>
				</fieldset>
				<div class="imgedit-crop-apply imgedit-menu container">
					<button class="button-primary" type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this );" class="imgedit-crop-apply button"><?php 
    esc_html_e('Apply Crop');
    ?></button> <button type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this );" class="imgedit-crop-clear button" disabled="disabled"><?php 
    esc_html_e('Clear Crop');
    ?></button>
				</div>
			</div>
		</div>
	</div>

	<?php 
    if ($edit_thumbnails_separately && $thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
		<div class="imgedit-group-top">
			<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
			<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
			<?php 
        /* translators: Hidden accessibility text. */
        esc_html_e('Thumbnail Settings Help');
        ?>
			</span></button>
			<div class="imgedit-help">
			<p><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
			</div>
		</div>
		<div class="imgedit-thumbnail-preview-group">
			<figure class="imgedit-thumbnail-preview">
				<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
				<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
			</figure>
			<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
			<fieldset>
				<legend><?php 
        _e('Apply changes to:');
        ?></legend>

				<span class="imgedit-label">
					<input type="radio" id="imgedit-target-all" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
					<label for="imgedit-target-all"><?php 
        _e('All image sizes');
        ?></label>
				</span>

				<span class="imgedit-label">
					<input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
					<label for="imgedit-target-thumbnail"><?php 
        _e('Thumbnail');
        ?></label>
				</span>

				<span class="imgedit-label">
					<input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
					<label for="imgedit-target-nothumb"><?php 
        _e('All sizes except thumbnail');
        ?></label>
				</span>

				</fieldset>
			</div>
		</div>
	</div>
	<?php 
    }
    ?>
		</div>
	</div>

	</div>

	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
	<?php 
}

WordPress Version: 6.3

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int          $post_id Attachment post ID.
 * @param false|object $msg     Optional. Message to display for image editor updates or errors.
 *                              Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 600) ? 600 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = wp_basename($meta['file']) !== $backup_sizes['full-orig']['file'];
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='notice notice-error' tabindex='-1' role='alert'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='notice notice-success' tabindex='-1' role='alert'><p>{$msg->msg}</p></div>";
        }
    }
    /**
     * Shows the settings in the Image Editor that allow selecting to edit only the thumbnail of an image.
     *
     * @since 6.3.0
     *
     * @param bool $show Whether to show the settings in the Image Editor. Default false.
     */
    $edit_thumbnails_separately = (bool) apply_filters('image_edit_thumbnails_separately', false);
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">
	<?php 
    echo $note;
    ?>
	<div class="imgedit-panel-content imgedit-panel-tools wp-clearfix">
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.toggleCropTool( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this );" aria-expanded="false" aria-controls="imgedit-crop" class="imgedit-crop button disabled" disabled><?php 
    esc_html_e('Crop');
    ?></button>
			<button type="button" class="imgedit-scale button" onclick="imageEdit.toggleControls(this);" aria-expanded="false" aria-controls="imgedit-scale"><?php 
    esc_html_e('Scale');
    ?></button>
			<div class="imgedit-rotate-menu-container">
				<button type="button" aria-controls="imgedit-rotate-menu" class="imgedit-rotate button" aria-expanded="false" onclick="imageEdit.togglePopup(this)"><?php 
    esc_html_e('Image Rotation');
    ?></button>
				<div id="imgedit-rotate-menu" class="imgedit-popup-menu">
			<?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536.
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
					<button type="button" class="imgedit-rleft button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate 90° left');
        ?></button>
					<button type="button" class="imgedit-rright button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate 90° right');
        ?></button>
					<button type="button" class="imgedit-rfull button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate(180, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate 180°');
        ?></button>
				<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
					<button type="button" class="imgedit-rleft button disabled" disabled></button>
					<button type="button" class="imgedit-rright button disabled" disabled></button>
				<?php 
    }
    ?>
					<hr />
					<button type="button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><?php 
    esc_html_e('Flip vertical');
    ?></button>
					<button type="button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><?php 
    esc_html_e('Flip horizontal');
    ?></button>
					<?php 
    echo $note_no_rotate;
    ?>
				</div>
			</div>
		</div>
		<div class="imgedit-submit imgedit-menu">
			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><?php 
    esc_html_e('Undo');
    ?></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><?php 
    esc_html_e('Redo');
    ?></button>
			<button type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn"><?php 
    esc_html_e('Cancel Editing');
    ?></button>
			<button type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn"><?php 
    esc_html_e('Save Edits');
    ?></button>
		</div>
	</div>

	<div class="imgedit-panel-content wp-clearfix">
		<div class="imgedit-tools">
			<input type="hidden" id="imgedit-nonce-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $nonce;
    ?>" />
			<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
			<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
			<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
			<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
			<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
			<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

			<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
			<div class="imgedit-crop-grid"></div>
			<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')"
				src="<?php 
    echo esc_url(admin_url('admin-ajax.php', 'relative')) . '?action=imgedit-preview&amp;_ajax_nonce=' . $nonce . '&amp;postid=' . $post_id . '&amp;rand=' . rand(1, 99999);
    ?>" alt="" />
			</div>
		</div>
		<div class="imgedit-settings">
			<div class="imgedit-tool-active">
				<div class="imgedit-group">
				<div id="imgedit-scale" tabindex="-1" class="imgedit-group-controls">
					<div class="imgedit-group-top">
						<h2><?php 
    _e('Scale Image');
    ?></h2>
						<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
						<?php 
    /* translators: Hidden accessibility text. */
    esc_html_e('Scale Image Help');
    ?>
						</span></button>
						<div class="imgedit-help">
						<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
						</div>
						<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
						<p>
							<?php 
        printf(
            /* translators: %s: Image width and height in pixels. */
            __('Original dimensions %s'),
            '<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
        );
        ?>
						</p>
						<?php 
    }
    ?>
						<div class="imgedit-submit">
						<fieldset class="imgedit-scale-controls">
							<legend><?php 
    _e('New dimensions:');
    ?></legend>
							<div class="nowrap">
							<label for="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
							<?php 
    /* translators: Hidden accessibility text. */
    _e('scale height');
    ?>
							</label>
							<input type="number" step="1" min="0" max="<?php 
    echo isset($meta['width']) ? $meta['width'] : '';
    ?>" aria-describedby="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>"  id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
							<span class="imgedit-separator" aria-hidden="true">&times;</span>
							<label for="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale height');
    ?></label>
							<input type="number" step="1" min="0" max="<?php 
    echo isset($meta['height']) ? $meta['height'] : '';
    ?>" aria-describedby="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
							<button id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary"><?php 
    esc_html_e('Scale');
    ?></button>
							<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>"><span class="dashicons dashicons-warning" aria-hidden="true"></span><?php 
    esc_html_e('Images cannot be scaled to a size larger than the original.');
    ?></span>
							</div>
						</fieldset>
						</div>
					</div>
				</div>
			</div>

		<?php 
    if ($can_restore) {
        ?>
				<div class="imgedit-group">
				<div class="imgedit-group-top">
					<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link" aria-expanded="false"><?php 
        _e('Restore original image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
					<div class="imgedit-help imgedit-restore">
					<p>
					<?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?>
					</p>
					<div class="imgedit-submit">
						<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
					</div>
				</div>
			</div>
			</div>
		<?php 
    }
    ?>
			<div class="imgedit-group">
				<div id="imgedit-crop" tabindex="-1" class="imgedit-group-controls">
				<div class="imgedit-group-top">
					<h2><?php 
    _e('Crop Image');
    ?></h2>
					<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('Image Crop Help');
    ?>
					</span></button>
					<div class="imgedit-help">
						<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>
						<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
						<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

						<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
						<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
					</div>
				</div>
				<fieldset class="imgedit-crop-ratio">
					<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
					<div class="nowrap">
					<label for="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('crop ratio width');
    ?>
					</label>
					<input type="number" step="1" min="1" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
					<span class="imgedit-separator" aria-hidden="true">:</span>
					<label for="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('crop ratio height');
    ?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
					</div>
				</fieldset>
				<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
					<legend><?php 
    _e('Selection:');
    ?></legend>
					<div class="nowrap">
					<label for="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('selection width');
    ?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
					<span class="imgedit-separator" aria-hidden="true">&times;</span>
					<label for="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('selection height');
    ?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
					</div>
				</fieldset>
				<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
					<legend><?php 
    _e('Starting Coordinates:');
    ?></legend>
					<div class="nowrap">
					<label for="imgedit-start-x-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('horizontal start position');
    ?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-start-x-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" value="0" />
					<span class="imgedit-separator" aria-hidden="true">&times;</span>
					<label for="imgedit-start-y-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
					<?php 
    /* translators: Hidden accessibility text. */
    _e('vertical start position');
    ?>
					</label>
					<input  type="number" step="1" min="0" id="imgedit-start-y-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" value="0" />
					</div>
				</fieldset>
				<div class="imgedit-crop-apply imgedit-menu container">
					<button class="button-primary" type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this );" class="imgedit-crop-apply button"><?php 
    esc_html_e('Apply Crop');
    ?></button> <button type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this );" class="imgedit-crop-clear button" disabled="disabled"><?php 
    esc_html_e('Clear Crop');
    ?></button>
				</div>
			</div>
		</div>
	</div>

	<?php 
    if ($edit_thumbnails_separately && $thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
		<div class="imgedit-group-top">
			<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
			<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
			<?php 
        /* translators: Hidden accessibility text. */
        esc_html_e('Thumbnail Settings Help');
        ?>
			</span></button>
			<div class="imgedit-help">
			<p><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
			</div>
		</div>
		<div class="imgedit-thumbnail-preview-group">
			<figure class="imgedit-thumbnail-preview">
				<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
				<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
			</figure>
			<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
			<fieldset>
				<legend><?php 
        _e('Apply changes to:');
        ?></legend>

				<span class="imgedit-label">
					<input type="radio" id="imgedit-target-all" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
					<label for="imgedit-target-all"><?php 
        _e('All image sizes');
        ?></label>
				</span>

				<span class="imgedit-label">
					<input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
					<label for="imgedit-target-thumbnail"><?php 
        _e('Thumbnail');
        ?></label>
				</span>

				<span class="imgedit-label">
					<input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
					<label for="imgedit-target-nothumb"><?php 
        _e('All sizes except thumbnail');
        ?></label>
				</span>

				</fieldset>
			</div>
		</div>
	</div>
	<?php 
    }
    ?>
		</div>
	</div>

	</div>

	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
	<?php 
}

WordPress Version: 6.2

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int          $post_id Attachment post ID.
 * @param false|object $msg     Optional. Message to display for image editor updates or errors.
 *                              Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = wp_basename($meta['file']) !== $backup_sizes['full-orig']['file'];
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='notice notice-error' tabindex='-1' role='alert'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='notice notice-success' tabindex='-1' role='alert'><p>{$msg->msg}</p></div>";
        }
    }
    $edit_custom_sizes = false;
    /**
     * Filters whether custom sizes are available options for image editing.
     *
     * @since 6.0.0
     *
     * @param bool|string[] $edit_custom_sizes True if custom sizes can be edited or array of custom size names.
     */
    $edit_custom_sizes = apply_filters('edit_custom_thumbnail_sizes', $edit_custom_sizes);
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-panel-content wp-clearfix">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this )" class="imgedit-crop button disabled" disabled><?php 
    esc_html_e('Crop');
    ?></button>
			<?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536.
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
				<button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate left');
        ?></button>
				<button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate right');
        ?></button>
				<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
				<button type="button" class="imgedit-rleft button disabled" disabled></button>
				<button type="button" class="imgedit-rright button disabled" disabled></button>
			<?php 
    }
    ?>

			<button type="button" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><?php 
    esc_html_e('Flip vertical');
    ?></button>
			<button type="button" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><?php 
    esc_html_e('Flip horizontal');
    ?></button>

			<br class="imgedit-undo-redo-separator" />
			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><?php 
    esc_html_e('Undo');
    ?></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><?php 
    esc_html_e('Redo');
    ?></button>
			<?php 
    echo $note_no_rotate;
    ?>
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')"
			src="<?php 
    echo esc_url(admin_url('admin-ajax.php', 'relative')) . '?action=imgedit-preview&amp;_ajax_nonce=' . $nonce . '&amp;postid=' . $post_id . '&amp;rand=' . rand(1, 99999);
    ?>" alt="" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
			<?php 
    /* translators: Hidden accessibility text. */
    esc_html_e('Scale Image Help');
    ?>
		</span></button>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p>
			<?php 
        printf(
            /* translators: %s: Image width and height in pixels. */
            __('Original dimensions %s'),
            '<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
        );
        ?>
		</p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">

		<fieldset class="imgedit-scale">
		<legend><?php 
    _e('New dimensions:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
			<?php 
    /* translators: Hidden accessibility text. */
    _e('scale width');
    ?>
		</label>
		<input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
			<?php 
    /* translators: Hidden accessibility text. */
    _e('scale height');
    ?>
		</label>
		<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span>
		<div class="imgedit-scale-button-wrapper"><input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" /></div>
		</div>
		</fieldset>

		</div>
	</div>
	</div>

	<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link" aria-expanded="false"><?php 
        _e('Restore original image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
		<div class="imgedit-help imgedit-restore">
		<p>
			<?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?>
		</p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

	<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
			<?php 
    /* translators: Hidden accessibility text. */
    esc_html_e('Image Crop Help');
    ?>
		</span></button>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<fieldset class="imgedit-crop-ratio">
		<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
			<?php 
    /* translators: Hidden accessibility text. */
    _e('crop ratio width');
    ?>
		</label>
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
		<span class="imgedit-separator" aria-hidden="true">:</span>
		<label for="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
			<?php 
    /* translators: Hidden accessibility text. */
    _e('crop ratio height');
    ?>
		</label>
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
		</div>
	</fieldset>

	<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
		<legend><?php 
    _e('Selection:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
			<?php 
    /* translators: Hidden accessibility text. */
    _e('selection width');
    ?>
		</label>
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text">
			<?php 
    /* translators: Hidden accessibility text. */
    _e('selection height');
    ?>
		</label>
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</div>
	</fieldset>

	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
			<?php 
        /* translators: Hidden accessibility text. */
        esc_html_e('Thumbnail Settings Help');
        ?>
		</span></button>
		<div class="imgedit-help">
		<p><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
		</div>
	</div>

	<figure class="imgedit-thumbnail-preview">
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
	</figure>

	<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
	<fieldset>
		<legend><?php 
        _e('Apply changes to:');
        ?></legend>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-all" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
			<label for="imgedit-target-all"><?php 
        _e('All image sizes');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
			<label for="imgedit-target-thumbnail"><?php 
        _e('Thumbnail');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
			<label for="imgedit-target-nothumb"><?php 
        _e('All sizes except thumbnail');
        ?></label>
		</span>
		<?php 
        if ($edit_custom_sizes) {
            if (!is_array($edit_custom_sizes)) {
                $edit_custom_sizes = get_intermediate_image_sizes();
            }
            foreach (array_unique($edit_custom_sizes) as $key => $size) {
                if (array_key_exists($size, $meta['sizes'])) {
                    if ('thumbnail' === $size) {
                        continue;
                    }
                    ?>
					<span class="imgedit-label">
						<input type="radio" id="imgedit-target-custom<?php 
                    echo esc_attr($key);
                    ?>" name="imgedit-target-<?php 
                    echo $post_id;
                    ?>" value="<?php 
                    echo esc_attr($size);
                    ?>" />
						<label for="imgedit-target-custom<?php 
                    echo esc_attr($key);
                    ?>"><?php 
                    echo esc_html($size);
                    ?></label>
					</span>
					<?php 
                }
            }
        }
        ?>
	</fieldset>
	</div>
	</div>

	<?php 
    }
    ?>

	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
	<?php 
}

WordPress Version: 6.1

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int          $post_id Attachment post ID.
 * @param false|object $msg     Optional. Message to display for image editor updates or errors.
 *                              Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = wp_basename($meta['file']) !== $backup_sizes['full-orig']['file'];
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='notice notice-error' tabindex='-1' role='alert'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='notice notice-success' tabindex='-1' role='alert'><p>{$msg->msg}</p></div>";
        }
    }
    $edit_custom_sizes = false;
    /**
     * Filters whether custom sizes are available options for image editing.
     *
     * @since 6.0.0
     *
     * @param bool|string[] $edit_custom_sizes True if custom sizes can be edited or array of custom size names.
     */
    $edit_custom_sizes = apply_filters('edit_custom_thumbnail_sizes', $edit_custom_sizes);
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-panel-content wp-clearfix">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this )" class="imgedit-crop button disabled" disabled><?php 
    esc_html_e('Crop');
    ?></button>
			<?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536.
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
				<button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate left');
        ?></button>
				<button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate right');
        ?></button>
				<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
				<button type="button" class="imgedit-rleft button disabled" disabled></button>
				<button type="button" class="imgedit-rright button disabled" disabled></button>
			<?php 
    }
    ?>

			<button type="button" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><?php 
    esc_html_e('Flip vertical');
    ?></button>
			<button type="button" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><?php 
    esc_html_e('Flip horizontal');
    ?></button>

			<br class="imgedit-undo-redo-separator" />
			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><?php 
    esc_html_e('Undo');
    ?></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><?php 
    esc_html_e('Redo');
    ?></button>
			<?php 
    echo $note_no_rotate;
    ?>
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')"
			src="<?php 
    echo esc_url(admin_url('admin-ajax.php', 'relative')) . '?action=imgedit-preview&amp;_ajax_nonce=' . $nonce . '&amp;postid=' . $post_id . '&amp;rand=' . rand(1, 99999);
    ?>" alt="" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Scale Image Help');
    ?></span></button>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p>
			<?php 
        printf(
            /* translators: %s: Image width and height in pixels. */
            __('Original dimensions %s'),
            '<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
        );
        ?>
		</p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">

		<fieldset class="imgedit-scale">
		<legend><?php 
    _e('New dimensions:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale width');
    ?></label>
		<input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale height');
    ?></label>
		<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span>
		<div class="imgedit-scale-button-wrapper"><input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" /></div>
		</div>
		</fieldset>

		</div>
	</div>
	</div>

	<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link" aria-expanded="false"><?php 
        _e('Restore original image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
		<div class="imgedit-help imgedit-restore">
		<p>
			<?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?>
		</p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

	<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Image Crop Help');
    ?></span></button>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<fieldset class="imgedit-crop-ratio">
		<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio width');
    ?></label>
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
		<span class="imgedit-separator" aria-hidden="true">:</span>
		<label for="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio height');
    ?></label>
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
		</div>
	</fieldset>

	<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
		<legend><?php 
    _e('Selection:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection width');
    ?></label>
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection height');
    ?></label>
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</div>
	</fieldset>

	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
        esc_html_e('Thumbnail Settings Help');
        ?></span></button>
		<div class="imgedit-help">
		<p><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
		</div>
	</div>

	<figure class="imgedit-thumbnail-preview">
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
	</figure>

	<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
	<fieldset>
		<legend><?php 
        _e('Apply changes to:');
        ?></legend>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-all" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
			<label for="imgedit-target-all"><?php 
        _e('All image sizes');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
			<label for="imgedit-target-thumbnail"><?php 
        _e('Thumbnail');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
			<label for="imgedit-target-nothumb"><?php 
        _e('All sizes except thumbnail');
        ?></label>
		</span>
		<?php 
        if ($edit_custom_sizes) {
            if (!is_array($edit_custom_sizes)) {
                $edit_custom_sizes = get_intermediate_image_sizes();
            }
            foreach (array_unique($edit_custom_sizes) as $key => $size) {
                if (array_key_exists($size, $meta['sizes'])) {
                    if ('thumbnail' === $size) {
                        continue;
                    }
                    ?>
					<span class="imgedit-label">
						<input type="radio" id="imgedit-target-custom<?php 
                    echo esc_attr($key);
                    ?>" name="imgedit-target-<?php 
                    echo $post_id;
                    ?>" value="<?php 
                    echo esc_attr($size);
                    ?>" />
						<label for="imgedit-target-custom<?php 
                    echo esc_attr($key);
                    ?>"><?php 
                    echo esc_html($size);
                    ?></label>
					</span>
					<?php 
                }
            }
        }
        ?>
	</fieldset>
	</div>
	</div>

	<?php 
    }
    ?>

	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
	<?php 
}

WordPress Version: 5.8

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int          $post_id Attachment post ID.
 * @param false|object $msg     Optional. Message to display for image editor updates or errors.
 *                              Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = wp_basename($meta['file']) !== $backup_sizes['full-orig']['file'];
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='notice notice-error' tabindex='-1' role='alert'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='notice notice-success' tabindex='-1' role='alert'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-panel-content wp-clearfix">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this )" class="imgedit-crop button disabled" disabled><?php 
    esc_html_e('Crop');
    ?></button>
			<?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536.
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
				<button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate left');
        ?></button>
				<button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate right');
        ?></button>
				<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
				<button type="button" class="imgedit-rleft button disabled" disabled></button>
				<button type="button" class="imgedit-rright button disabled" disabled></button>
			<?php 
    }
    ?>

			<button type="button" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><?php 
    esc_html_e('Flip vertical');
    ?></button>
			<button type="button" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><?php 
    esc_html_e('Flip horizontal');
    ?></button>

			<br class="imgedit-undo-redo-separator" />
			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><?php 
    esc_html_e('Undo');
    ?></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><?php 
    esc_html_e('Redo');
    ?></button>
			<?php 
    echo $note_no_rotate;
    ?>
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')"
			src="<?php 
    echo esc_url(admin_url('admin-ajax.php', 'relative')) . '?action=imgedit-preview&amp;_ajax_nonce=' . $nonce . '&amp;postid=' . $post_id . '&amp;rand=' . rand(1, 99999);
    ?>" alt="" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Scale Image Help');
    ?></span></button>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p>
			<?php 
        printf(
            /* translators: %s: Image width and height in pixels. */
            __('Original dimensions %s'),
            '<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
        );
        ?>
		</p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">

		<fieldset class="imgedit-scale">
		<legend><?php 
    _e('New dimensions:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale width');
    ?></label>
		<input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale height');
    ?></label>
		<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span>
		<div class="imgedit-scale-button-wrapper"><input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" /></div>
		</div>
		</fieldset>

		</div>
	</div>
	</div>

	<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link" aria-expanded="false"><?php 
        _e('Restore original image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
		<div class="imgedit-help imgedit-restore">
		<p>
			<?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?>
		</p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

	<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Image Crop Help');
    ?></span></button>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<fieldset class="imgedit-crop-ratio">
		<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio width');
    ?></label>
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
		<span class="imgedit-separator" aria-hidden="true">:</span>
		<label for="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio height');
    ?></label>
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
		</div>
	</fieldset>

	<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
		<legend><?php 
    _e('Selection:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection width');
    ?></label>
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection height');
    ?></label>
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</div>
	</fieldset>

	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
        esc_html_e('Thumbnail Settings Help');
        ?></span></button>
		<div class="imgedit-help">
		<p><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
		</div>
	</div>

	<figure class="imgedit-thumbnail-preview">
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
	</figure>

	<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
	<fieldset>
		<legend><?php 
        _e('Apply changes to:');
        ?></legend>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-all" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
			<label for="imgedit-target-all"><?php 
        _e('All image sizes');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
			<label for="imgedit-target-thumbnail"><?php 
        _e('Thumbnail');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
			<label for="imgedit-target-nothumb"><?php 
        _e('All sizes except thumbnail');
        ?></label>
		</span>
	</fieldset>
	</div>
	</div>

	<?php 
    }
    ?>

	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
	<?php 
}

WordPress Version: 5.7

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int          $post_id Attachment post ID.
 * @param false|object $msg     Optional. Message to display for image editor updates or errors.
 *                              Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = wp_basename($meta['file']) !== $backup_sizes['full-orig']['file'];
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='notice notice-error' tabindex='-1' role='alert'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='notice notice-success' tabindex='-1' role='alert'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-panel-content wp-clearfix">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this )" class="imgedit-crop button disabled" disabled><?php 
    esc_html_e('Crop');
    ?></button>
			<?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536.
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
				<button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate left');
        ?></button>
				<button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate right');
        ?></button>
				<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
				<button type="button" class="imgedit-rleft button disabled" disabled></button>
				<button type="button" class="imgedit-rright button disabled" disabled></button>
			<?php 
    }
    ?>

			<button type="button" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><?php 
    esc_html_e('Flip vertical');
    ?></button>
			<button type="button" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><?php 
    esc_html_e('Flip horizontal');
    ?></button>

			<br class="imgedit-undo-redo-separator" />
			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><?php 
    esc_html_e('Undo');
    ?></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><?php 
    esc_html_e('Redo');
    ?></button>
			<?php 
    echo $note_no_rotate;
    ?>
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" alt="" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Scale Image Help');
    ?></span></button>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p>
			<?php 
        printf(
            /* translators: %s: Image width and height in pixels. */
            __('Original dimensions %s'),
            '<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
        );
        ?>
		</p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">

		<fieldset class="imgedit-scale">
		<legend><?php 
    _e('New dimensions:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale width');
    ?></label>
		<input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale height');
    ?></label>
		<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span>
		<div class="imgedit-scale-button-wrapper"><input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" /></div>
		</div>
		</fieldset>

		</div>
	</div>
	</div>

	<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link" aria-expanded="false"><?php 
        _e('Restore original image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
		<div class="imgedit-help imgedit-restore">
		<p>
			<?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?>
		</p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

	<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Image Crop Help');
    ?></span></button>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<fieldset class="imgedit-crop-ratio">
		<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio width');
    ?></label>
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
		<span class="imgedit-separator" aria-hidden="true">:</span>
		<label for="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio height');
    ?></label>
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
		</div>
	</fieldset>

	<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
		<legend><?php 
    _e('Selection:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection width');
    ?></label>
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection height');
    ?></label>
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</div>
	</fieldset>

	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
        esc_html_e('Thumbnail Settings Help');
        ?></span></button>
		<div class="imgedit-help">
		<p><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
		</div>
	</div>

	<figure class="imgedit-thumbnail-preview">
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
	</figure>

	<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
	<fieldset>
		<legend><?php 
        _e('Apply changes to:');
        ?></legend>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-all" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
			<label for="imgedit-target-all"><?php 
        _e('All image sizes');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
			<label for="imgedit-target-thumbnail"><?php 
        _e('Thumbnail');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
			<label for="imgedit-target-nothumb"><?php 
        _e('All sizes except thumbnail');
        ?></label>
		</span>
	</fieldset>
	</div>
	</div>

	<?php 
    }
    ?>

	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
	<?php 
}

WordPress Version: 5.5

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int         $post_id Attachment post ID.
 * @param bool|object $msg     Optional. Message to display for image editor updates or errors.
 *                             Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = wp_basename($meta['file']) !== $backup_sizes['full-orig']['file'];
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='notice notice-error' tabindex='-1' role='alert'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='notice notice-success' tabindex='-1' role='alert'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-panel-content wp-clearfix">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this )" class="imgedit-crop button disabled" disabled><?php 
    esc_html_e('Crop');
    ?></button>
			<?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536.
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
				<button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate left');
        ?></button>
				<button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate right');
        ?></button>
				<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
				<button type="button" class="imgedit-rleft button disabled" disabled></button>
				<button type="button" class="imgedit-rright button disabled" disabled></button>
			<?php 
    }
    ?>

			<button type="button" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><?php 
    esc_html_e('Flip vertical');
    ?></button>
			<button type="button" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><?php 
    esc_html_e('Flip horizontal');
    ?></button>

			<br class="imgedit-undo-redo-separator" />
			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><?php 
    esc_html_e('Undo');
    ?></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><?php 
    esc_html_e('Redo');
    ?></button>
			<?php 
    echo $note_no_rotate;
    ?>
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" alt="" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Scale Image Help');
    ?></span></button>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p>
			<?php 
        printf(
            /* translators: %s: Image width and height in pixels. */
            __('Original dimensions %s'),
            '<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
        );
        ?>
		</p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">

		<fieldset class="imgedit-scale">
		<legend><?php 
    _e('New dimensions:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale width');
    ?></label>
		<input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale height');
    ?></label>
		<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span>
		<div class="imgedit-scale-button-wrapper"><input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" /></div>
		</div>
		</fieldset>

		</div>
	</div>
	</div>

	<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link" aria-expanded="false"><?php 
        _e('Restore original image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
		<div class="imgedit-help imgedit-restore">
		<p>
			<?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?>
		</p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

	<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Image Crop Help');
    ?></span></button>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<fieldset class="imgedit-crop-ratio">
		<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio width');
    ?></label>
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
		<span class="imgedit-separator" aria-hidden="true">:</span>
		<label for="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio height');
    ?></label>
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
		</div>
	</fieldset>

	<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
		<legend><?php 
    _e('Selection:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection width');
    ?></label>
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection height');
    ?></label>
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</div>
	</fieldset>

	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text"><?php 
        esc_html_e('Thumbnail Settings Help');
        ?></span></button>
		<div class="imgedit-help">
		<p><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
		</div>
	</div>

	<figure class="imgedit-thumbnail-preview">
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
	</figure>

	<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
	<fieldset>
		<legend><?php 
        _e('Apply changes to:');
        ?></legend>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-all" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
			<label for="imgedit-target-all"><?php 
        _e('All image sizes');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
			<label for="imgedit-target-thumbnail"><?php 
        _e('Thumbnail');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
			<label for="imgedit-target-nothumb"><?php 
        _e('All sizes except thumbnail');
        ?></label>
		</span>
	</fieldset>
	</div>
	</div>

	<?php 
    }
    ?>

	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
	<?php 
}

WordPress Version: 5.4

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int         $post_id Attachment post ID.
 * @param bool|object $msg     Optional. Message to display for image editor updates or errors.
 *                             Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = wp_basename($meta['file']) !== $backup_sizes['full-orig']['file'];
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Scale Image Help');
    ?></span></button>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p>
			<?php 
        printf(
            /* translators: %s: Image width and height in pixels. */
            __('Original dimensions %s'),
            '<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
        );
        ?>
		</p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">

		<fieldset class="imgedit-scale">
		<legend><?php 
    _e('New dimensions:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale width');
    ?></label>
		<input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale height');
    ?></label>
		<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span>
		<div class="imgedit-scale-button-wrapper"><input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" /></div>
		</div>
		</fieldset>

		</div>
	</div>
	</div>

	<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link"><?php 
        _e('Restore Original Image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
		<div class="imgedit-help imgedit-restore">
		<p>
			<?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?>
		</p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

	<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Image Crop Help');
    ?></span></button>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<fieldset class="imgedit-crop-ratio">
		<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio width');
    ?></label>
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
		<span class="imgedit-separator" aria-hidden="true">:</span>
		<label for="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio height');
    ?></label>
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
		</div>
	</fieldset>

	<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
		<legend><?php 
    _e('Selection:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection width');
    ?></label>
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection height');
    ?></label>
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</div>
	</fieldset>

	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
        esc_html_e('Thumbnail Settings Help');
        ?></span></button>
		<div class="imgedit-help">
		<p><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
		</div>
	</div>

	<figure class="imgedit-thumbnail-preview">
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
	</figure>

	<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
	<fieldset>
		<legend><?php 
        _e('Apply changes to:');
        ?></legend>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-all" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
			<label for="imgedit-target-all"><?php 
        _e('All image sizes');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
			<label for="imgedit-target-thumbnail"><?php 
        _e('Thumbnail');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
			<label for="imgedit-target-nothumb"><?php 
        _e('All sizes except thumbnail');
        ?></label>
		</span>
	</fieldset>
	</div>
	</div>

	<?php 
    }
    ?>

	</div>

	<div class="imgedit-panel-content wp-clearfix">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this )" class="imgedit-crop button disabled" disabled><?php 
    esc_html_e('Crop');
    ?></button>
			<?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536.
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
				<button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate left');
        ?></button>
				<button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate right');
        ?></button>
				<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
				<button type="button" class="imgedit-rleft button disabled" disabled></button>
				<button type="button" class="imgedit-rright button disabled" disabled></button>
			<?php 
    }
    ?>

			<button type="button" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><?php 
    esc_html_e('Flip vertical');
    ?></button>
			<button type="button" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><?php 
    esc_html_e('Flip horizontal');
    ?></button>

			<br class="imgedit-undo-redo-separator" />
			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><?php 
    esc_html_e('Undo');
    ?></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><?php 
    esc_html_e('Redo');
    ?></button>
			<?php 
    echo $note_no_rotate;
    ?>
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" alt="" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
	<?php 
}

WordPress Version: 5.3

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int         $post_id Post ID.
 * @param bool|object $msg     Optional. Message to display for image editor updates or errors.
 *                             Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = $backup_sizes['full-orig']['file'] != wp_basename($meta['file']);
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Scale Image Help');
    ?></span></button>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p>
			<?php 
        printf(
            /* translators: %s: Image width and height in pixels. */
            __('Original dimensions %s'),
            '<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
        );
        ?>
		</p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">

		<fieldset class="imgedit-scale">
		<legend><?php 
    _e('New dimensions:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale width');
    ?></label>
		<input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('scale height');
    ?></label>
		<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span>
		<div class="imgedit-scale-button-wrapper"><input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" /></div>
		</div>
		</fieldset>

		</div>
	</div>
	</div>

	<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link"><?php 
        _e('Restore Original Image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
		<div class="imgedit-help">
		<p>
			<?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?>
		</p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

	<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Image Crop Help');
    ?></span></button>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<fieldset class="imgedit-crop-ratio">
		<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio width');
    ?></label>
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
		<span class="imgedit-separator" aria-hidden="true">:</span>
		<label for="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('crop ratio height');
    ?></label>
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
		</div>
	</fieldset>

	<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
		<legend><?php 
    _e('Selection:');
    ?></legend>
		<div class="nowrap">
		<label for="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection width');
    ?></label>
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		<span class="imgedit-separator" aria-hidden="true">&times;</span>
		<label for="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" class="screen-reader-text"><?php 
    _e('selection height');
    ?></label>
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</div>
	</fieldset>

	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
        esc_html_e('Thumbnail Settings Help');
        ?></span></button>
		<p class="imgedit-help"><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
	</div>

	<figure class="imgedit-thumbnail-preview">
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
	</figure>

	<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
	<fieldset>
		<legend><?php 
        _e('Apply changes to:');
        ?></legend>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-all" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
			<label for="imgedit-target-all"><?php 
        _e('All image sizes');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
			<label for="imgedit-target-thumbnail"><?php 
        _e('Thumbnail');
        ?></label>
		</span>

		<span class="imgedit-label">
			<input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
			<label for="imgedit-target-nothumb"><?php 
        _e('All sizes except thumbnail');
        ?></label>
		</span>
	</fieldset>
	</div>
	</div>

	<?php 
    }
    ?>

	</div>

	<div class="imgedit-panel-content wp-clearfix">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this )" class="imgedit-crop button disabled" disabled><?php 
    esc_html_e('Crop');
    ?></button>
			<?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
				<button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate left');
        ?></button>
				<button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><?php 
        esc_html_e('Rotate right');
        ?></button>
				<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
				<button type="button" class="imgedit-rleft button disabled" disabled></button>
				<button type="button" class="imgedit-rright button disabled" disabled></button>
			<?php 
    }
    ?>

			<button type="button" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><?php 
    esc_html_e('Flip vertical');
    ?></button>
			<button type="button" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><?php 
    esc_html_e('Flip horizontal');
    ?></button>

			<br class="imgedit-undo-redo-separator" />
			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><?php 
    esc_html_e('Undo');
    ?></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><?php 
    esc_html_e('Redo');
    ?></button>
			<?php 
    echo $note_no_rotate;
    ?>
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" alt="" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
	<?php 
}

WordPress Version: 5.2

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int         $post_id Post ID.
 * @param bool|object $msg     Optional. Message to display for image editor updates or errors.
 *                             Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = $backup_sizes['full-orig']['file'] != wp_basename($meta['file']);
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Scale Image Help');
    ?></span></button>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p><?php 
        printf(__('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height']);
        ?></p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">

		<fieldset class="imgedit-scale">
		<legend><?php 
    _e('New dimensions:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('scale width');
    ?></span>
		<input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		</label>
		<span class="imgedit-separator">&times;</span>
		<label><span class="screen-reader-text"><?php 
    _e('scale height');
    ?></span>
		<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		</label>
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span>
		<input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" />
		 </div>
		</fieldset>

		</div>
	</div>
	</div>

	<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link"><?php 
        _e('Restore Original Image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
		<div class="imgedit-help">
		<p>
		<?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?>
		</p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

	<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Image Crop Help');
    ?></span></button>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<fieldset class="imgedit-crop-ratio">
		<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('crop ratio width');
    ?></span>
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
		</label>
		<span class="imgedit-separator">:</span>
		<label><span class="screen-reader-text"><?php 
    _e('crop ratio height');
    ?></span>
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
		</label>
		</div>
	</fieldset>

	<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
		<legend><?php 
    _e('Selection:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('selection width');
    ?></span>
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</label>
		<span class="imgedit-separator">&times;</span>
		<label><span class="screen-reader-text"><?php 
    _e('selection height');
    ?></span>
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</label>
		</div>
	</fieldset>

	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
        esc_html_e('Thumbnail Settings Help');
        ?></span></button>
		<p class="imgedit-help"><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
	</div>

	<figure class="imgedit-thumbnail-preview">
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
	</figure>

	<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
	<fieldset>
		<legend><strong><?php 
        _e('Apply changes to:');
        ?></strong></legend>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
		<?php 
        _e('All image sizes');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
		<?php 
        _e('Thumbnail');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
		<?php 
        _e('All sizes except thumbnail');
        ?></label>
	</fieldset>
	</div>
	</div>

	<?php 
    }
    ?>

	</div>

	<div class="imgedit-panel-content wp-clearfix">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this )" class="imgedit-crop button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Crop');
    ?></span></button>
																		<?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
																		<button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><span class="screen-reader-text"><?php 
        esc_html_e('Rotate counter-clockwise');
        ?></span></button>
			<button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><span class="screen-reader-text"><?php 
        esc_html_e('Rotate clockwise');
        ?></span></button>
																			<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
																				<button type="button" class="imgedit-rleft button disabled" disabled></button>
																				<button type="button" class="imgedit-rright button disabled" disabled></button>
																		<?php 
    }
    ?>

			<button type="button" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><span class="screen-reader-text"><?php 
    esc_html_e('Flip vertically');
    ?></span></button>
			<button type="button" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><span class="screen-reader-text"><?php 
    esc_html_e('Flip horizontally');
    ?></span></button>

			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Undo');
    ?></span></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Redo');
    ?></span></button>
			<?php 
    echo $note_no_rotate;
    ?>
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" alt="" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
	<?php 
}

WordPress Version: 5.1

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @since 2.9.0
 *
 * @param int         $post_id Post ID.
 * @param bool|object $msg     Optional. Message to display for image editor updates or errors.
 *                             Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = $backup_sizes['full-orig']['file'] != basename($meta['file']);
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Scale Image Help');
    ?></span></button>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p><?php 
        printf(__('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height']);
        ?></p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">

		<fieldset class="imgedit-scale">
		<legend><?php 
    _e('New dimensions:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('scale width');
    ?></span>
		<input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		</label>
		<span class="imgedit-separator">&times;</span>
		<label><span class="screen-reader-text"><?php 
    _e('scale height');
    ?></span>
		<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		</label>
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span>
		<input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" />
		 </div>
		</fieldset>

		</div>
	</div>
	</div>

	<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link"><?php 
        _e('Restore Original Image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
		<div class="imgedit-help">
		<p>
		<?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?>
		</p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

	<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Image Crop Help');
    ?></span></button>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<fieldset class="imgedit-crop-ratio">
		<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('crop ratio width');
    ?></span>
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
		</label>
		<span class="imgedit-separator">:</span>
		<label><span class="screen-reader-text"><?php 
    _e('crop ratio height');
    ?></span>
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
		</label>
		</div>
	</fieldset>

	<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
		<legend><?php 
    _e('Selection:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('selection width');
    ?></span>
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</label>
		<span class="imgedit-separator">&times;</span>
		<label><span class="screen-reader-text"><?php 
    _e('selection height');
    ?></span>
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</label>
		</div>
	</fieldset>

	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
        esc_html_e('Thumbnail Settings Help');
        ?></span></button>
		<p class="imgedit-help"><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
	</div>

	<figure class="imgedit-thumbnail-preview">
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
	</figure>

	<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
	<fieldset>
		<legend><strong><?php 
        _e('Apply changes to:');
        ?></strong></legend>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
		<?php 
        _e('All image sizes');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
		<?php 
        _e('Thumbnail');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
		<?php 
        _e('All sizes except thumbnail');
        ?></label>
	</fieldset>
	</div>
	</div>

	<?php 
    }
    ?>

	</div>

	<div class="imgedit-panel-content wp-clearfix">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.handleCropToolClick( <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this )" class="imgedit-crop button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Crop');
    ?></span></button>
																		<?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
																		<button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><span class="screen-reader-text"><?php 
        esc_html_e('Rotate counter-clockwise');
        ?></span></button>
			<button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><span class="screen-reader-text"><?php 
        esc_html_e('Rotate clockwise');
        ?></span></button>
																			<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
																				<button type="button" class="imgedit-rleft button disabled" disabled></button>
																				<button type="button" class="imgedit-rright button disabled" disabled></button>
																		<?php 
    }
    ?>

			<button type="button" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><span class="screen-reader-text"><?php 
    esc_html_e('Flip vertically');
    ?></span></button>
			<button type="button" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><span class="screen-reader-text"><?php 
    esc_html_e('Flip horizontally');
    ?></span></button>

			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Undo');
    ?></span></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Redo');
    ?></span></button>
			<?php 
    echo $note_no_rotate;
    ?>
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" alt="" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
	<?php 
}

WordPress Version: 4.6

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @param int         $post_id Post ID.
 * @param bool|object $msg     Optional. Message to display for image editor updates or errors.
 *                             Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = $backup_sizes['full-orig']['file'] != basename($meta['file']);
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Scale Image Help');
    ?></span></button>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p><?php 
        printf(__('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height']);
        ?></p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">

		<fieldset class="imgedit-scale">
		<legend><?php 
    _e('New dimensions:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('scale width');
    ?></span>
		<input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1, this)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		</label>
		<span class="imgedit-separator">&times;</span>
		<label><span class="screen-reader-text"><?php 
    _e('scale height');
    ?></span>
		<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0, this)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		</label>
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span>
		<input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" />
 		</div>
		</fieldset>

		</div>
	</div>
	</div>

<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link"><?php 
        _e('Restore Original Image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
		<div class="imgedit-help">
		<p><?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?></p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Image Crop Help');
    ?></span></button>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<fieldset class="imgedit-crop-ratio">
		<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('crop ratio width');
    ?></span>
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
		</label>
		<span class="imgedit-separator">:</span>
		<label><span class="screen-reader-text"><?php 
    _e('crop ratio height');
    ?></span>
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
		</label>
		</div>
	</fieldset>

	<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
		<legend><?php 
    _e('Selection:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('selection width');
    ?></span>
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</label>
		<span class="imgedit-separator">&times;</span>
		<label><span class="screen-reader-text"><?php 
    _e('selection height');
    ?></span>
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" onblur="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>, this)" />
		</label>
		</div>
	</fieldset>

	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
        esc_html_e('Thumbnail Settings Help');
        ?></span></button>
		<p class="imgedit-help"><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
	</div>

	<figure class="imgedit-thumbnail-preview">
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
	</figure>

	<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
	<fieldset>
		<legend><strong><?php 
        _e('Apply changes to:');
        ?></strong></legend>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
		<?php 
        _e('All image sizes');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
		<?php 
        _e('Thumbnail');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
		<?php 
        _e('All sizes except thumbnail');
        ?></label>
	</fieldset>
	</div>
	</div>

	<?php 
    }
    ?>

	</div>

	<div class="imgedit-panel-content wp-clearfix">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.crop(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-crop button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Crop');
    ?></span></button><?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
			<button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><span class="screen-reader-text"><?php 
        esc_html_e('Rotate counter-clockwise');
        ?></span></button>
			<button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><span class="screen-reader-text"><?php 
        esc_html_e('Rotate clockwise');
        ?></span></button>
	<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
			<button type="button" class="imgedit-rleft button disabled" disabled></button>
			<button type="button" class="imgedit-rright button disabled" disabled></button>
	<?php 
    }
    ?>

			<button type="button" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><span class="screen-reader-text"><?php 
    esc_html_e('Flip vertically');
    ?></span></button>
			<button type="button" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><span class="screen-reader-text"><?php 
    esc_html_e('Flip horizontally');
    ?></span></button>

			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Undo');
    ?></span></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Redo');
    ?></span></button>
			<?php 
    echo $note_no_rotate;
    ?>
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" alt="" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
<?php 
}

WordPress Version: 4.5

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @param int         $post_id Post ID.
 * @param bool|object $msg     Optional. Message to display for image editor updates or errors.
 *                             Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = $backup_sizes['full-orig']['file'] != basename($meta['file']);
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap wp-clearfix">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Scale Image Help');
    ?></span></button>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p><?php 
        printf(__('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height']);
        ?></p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">

		<fieldset class="imgedit-scale">
		<legend><?php 
    _e('New dimensions:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('scale width');
    ?></span>
		<input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		</label>
		<span class="imgedit-separator">&times;</span>
		<label><span class="screen-reader-text"><?php 
    _e('scale height');
    ?></span>
		<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		</label>
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span>
		<input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" />
 		</div>
		</fieldset>

		</div>
	</div>
	</div>

<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link"><?php 
        _e('Restore Original Image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
		<div class="imgedit-help">
		<p><?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?></p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
    esc_html_e('Image Crop Help');
    ?></span></button>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<fieldset class="imgedit-crop-ratio">
		<legend><?php 
    _e('Aspect ratio:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('crop ratio width');
    ?></span>
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" />
		</label>
		<span class="imgedit-separator">:</span>
		<label><span class="screen-reader-text"><?php 
    _e('crop ratio height');
    ?></span>
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" />
		</label>
		</div>
	</fieldset>

	<fieldset id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-sel">
		<legend><?php 
    _e('Selection:');
    ?></legend>
		<div class="nowrap">
		<label><span class="screen-reader-text"><?php 
    _e('selection width');
    ?></span>
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" />
		</label>
		<span class="imgedit-separator">&times;</span>
		<label><span class="screen-reader-text"><?php 
    _e('selection height');
    ?></span>
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" />
		</label>
		</div>
	</fieldset>

	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?></h2>
		<button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" aria-expanded="false"><span class="screen-reader-text"><?php 
        esc_html_e('Thumbnail Settings Help');
        ?></span></button>
		<p class="imgedit-help"><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
	</div>

	<figure class="imgedit-thumbnail-preview">
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<figcaption class="imgedit-thumbnail-preview-caption"><?php 
        _e('Current thumbnail');
        ?></figcaption>
	</figure>

	<div id="imgedit-save-target-<?php 
        echo $post_id;
        ?>" class="imgedit-save-target">
	<fieldset>
		<legend><strong><?php 
        _e('Apply changes to:');
        ?></strong></legend>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
		<?php 
        _e('All image sizes');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
		<?php 
        _e('Thumbnail');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
		<?php 
        _e('All sizes except thumbnail');
        ?></label>
	</fieldset>
	</div>
	</div>

	<?php 
    }
    ?>

	</div>

	<div class="imgedit-panel-content wp-clearfix">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu wp-clearfix">
			<button type="button" onclick="imageEdit.crop(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-crop button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Crop');
    ?></span></button><?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        $note_no_rotate = '';
        ?>
			<button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><span class="screen-reader-text"><?php 
        esc_html_e('Rotate counter-clockwise');
        ?></span></button>
			<button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)"><span class="screen-reader-text"><?php 
        esc_html_e('Rotate clockwise');
        ?></span></button>
	<?php 
    } else {
        $note_no_rotate = '<p class="note-no-rotate"><em>' . __('Image rotation is not supported by your web host.') . '</em></p>';
        ?>
			<button type="button" class="imgedit-rleft button disabled" disabled></button>
			<button type="button" class="imgedit-rright button disabled" disabled></button>
	<?php 
    }
    ?>

			<button type="button" onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv button"><span class="screen-reader-text"><?php 
    esc_html_e('Flip vertically');
    ?></span></button>
			<button type="button" onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph button"><span class="screen-reader-text"><?php 
    esc_html_e('Flip horizontally');
    ?></span></button>

			<button type="button" id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Undo');
    ?></span></button>
			<button type="button" id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo button disabled" disabled><span class="screen-reader-text"><?php 
    esc_html_e('Redo');
    ?></span></button>
			<?php 
    echo $note_no_rotate;
    ?>
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" alt="" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button imgedit-cancel-btn" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<script type="text/javascript">jQuery( function() { imageEdit.init(<?php 
    echo $post_id;
    ?>); });</script>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
<?php 
}

WordPress Version: 4.4

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @param int         $post_id Post ID.
 * @param bool|object $msg     Optional. Message to display for image editor updates or errors.
 *                             Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = $backup_sizes['full-orig']['file'] != basename($meta['file']);
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Scale Image');
    ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h2>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p><?php 
        printf(__('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height']);
        ?></p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">
		<span class="nowrap"><input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" style="width:4em;" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" /> &times; <input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" style="width:4em;" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span></span>
		<input type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" />
		</div>
	</div>
	</div>

<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><a onclick="imageEdit.toggleHelp(this);return false;" href="#"><?php 
        _e('Restore Original Image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></a></h2>
		<div class="imgedit-help">
		<p><?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?></p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h2><?php 
    _e('Image Crop');
    ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h2>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<p>
		<?php 
    _e('Aspect ratio:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" style="width:3em;" />
		:
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" style="width:3em;" />
		</span>
	</p>

	<p id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>">
		<?php 
    _e('Selection:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		&times;
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		</span>
	</p>
	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h2><?php 
        _e('Thumbnail Settings');
        ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h2>
		<p class="imgedit-help"><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
	</div>

	<p>
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<br /><?php 
        _e('Current thumbnail');
        ?>
	</p>

	<p id="imgedit-save-target-<?php 
        echo $post_id;
        ?>">
		<strong><?php 
        _e('Apply changes to:');
        ?></strong><br />

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
		<?php 
        _e('All image sizes');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
		<?php 
        _e('Thumbnail');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
		<?php 
        _e('All sizes except thumbnail');
        ?></label>
	</p>
	</div>

	<?php 
    }
    ?>

	</div>

	<div class="imgedit-panel-content">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu">
			<div onclick="imageEdit.crop(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-crop disabled" title="<?php 
    esc_attr_e('Crop');
    ?>"></div><?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        ?>
			<div class="imgedit-rleft"  onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate counter-clockwise');
        ?>"></div>
			<div class="imgedit-rright" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate clockwise');
        ?>"></div>
	<?php 
    } else {
        $note_no_rotate = esc_attr__('Image rotation is not supported by your web host.');
        ?>
		    <div class="imgedit-rleft disabled"  title="<?php 
        echo $note_no_rotate;
        ?>"></div>
		    <div class="imgedit-rright disabled" title="<?php 
        echo $note_no_rotate;
        ?>"></div>
	<?php 
    }
    ?>

			<div onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv" title="<?php 
    esc_attr_e('Flip vertically');
    ?>"></div>
			<div onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph" title="<?php 
    esc_attr_e('Flip horizontally');
    ?>"></div>

			<div id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo disabled" title="<?php 
    esc_attr_e('Undo');
    ?>"></div>
			<div id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo disabled" title="<?php 
    esc_attr_e('Redo');
    ?>"></div>
			<br class="clear" />
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" alt="<?php 
    esc_attr_e('Image preview');
    ?>" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<script type="text/javascript">jQuery( function() { imageEdit.init(<?php 
    echo $post_id;
    ?>); });</script>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
<?php 
}

WordPress Version: 4.2

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * Loads the WP image-editing interface.
 *
 * @param int         $post_id Post ID.
 * @param bool|object $msg     Optional. Message to display for image editor updates or errors.
 *                             Default false.
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = $backup_sizes['full-orig']['file'] != basename($meta['file']);
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><?php 
    _e('Scale Image');
    ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p><?php 
        printf(__('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height']);
        ?></p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">
		<span class="nowrap"><input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" style="width:4em;" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" /> &times; <input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" style="width:4em;" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span></span>
		<input type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" />
		</div>
	</div>
	</div>

<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><a onclick="imageEdit.toggleHelp(this);return false;" href="#"><?php 
        _e('Restore Original Image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></a></h3>
		<div class="imgedit-help">
		<p><?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?></p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><?php 
    _e('Image Crop');
    ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<p>
		<?php 
    _e('Aspect ratio:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" style="width:3em;" />
		:
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" style="width:3em;" />
		</span>
	</p>

	<p id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>">
		<?php 
    _e('Selection:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		&times;
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		</span>
	</p>
	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h3><?php 
        _e('Thumbnail Settings');
        ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
		<p class="imgedit-help"><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
	</div>

	<p>
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<br /><?php 
        _e('Current thumbnail');
        ?>
	</p>

	<p id="imgedit-save-target-<?php 
        echo $post_id;
        ?>">
		<strong><?php 
        _e('Apply changes to:');
        ?></strong><br />

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
		<?php 
        _e('All image sizes');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
		<?php 
        _e('Thumbnail');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
		<?php 
        _e('All sizes except thumbnail');
        ?></label>
	</p>
	</div>

	<?php 
    }
    ?>

	</div>

	<div class="imgedit-panel-content">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu">
			<div onclick="imageEdit.crop(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-crop disabled" title="<?php 
    esc_attr_e('Crop');
    ?>"></div><?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        ?>
			<div class="imgedit-rleft"  onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate counter-clockwise');
        ?>"></div>
			<div class="imgedit-rright" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate clockwise');
        ?>"></div>
	<?php 
    } else {
        $note_no_rotate = esc_attr__('Image rotation is not supported by your web host.');
        ?>
		    <div class="imgedit-rleft disabled"  title="<?php 
        echo $note_no_rotate;
        ?>"></div>
		    <div class="imgedit-rright disabled" title="<?php 
        echo $note_no_rotate;
        ?>"></div>
	<?php 
    }
    ?>

			<div onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv" title="<?php 
    esc_attr_e('Flip vertically');
    ?>"></div>
			<div onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph" title="<?php 
    esc_attr_e('Flip horizontally');
    ?>"></div>

			<div id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo disabled" title="<?php 
    esc_attr_e('Undo');
    ?>"></div>
			<div id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo disabled" title="<?php 
    esc_attr_e('Redo');
    ?>"></div>
			<br class="clear" />
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<script type="text/javascript">jQuery( function() { imageEdit.init(<?php 
    echo $post_id;
    ?>); });</script>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
<?php 
}

WordPress Version: 4.1

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
/**
 * @param int $post_id
 * @param bool|object $msg
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = $backup_sizes['full-orig']['file'] != basename($meta['file']);
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><?php 
    _e('Scale Image');
    ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p><?php 
        printf(__('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height']);
        ?></p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">
		<span class="nowrap"><input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" style="width:4em;" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" /> &times; <input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" style="width:4em;" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span></span>
		<input type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" />
		</div>
	</div>
	</div>

<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><a onclick="imageEdit.toggleHelp(this);return false;" href="#"><?php 
        _e('Restore Original Image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></a></h3>
		<div class="imgedit-help">
		<p><?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?></p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><?php 
    _e('Image Crop');
    ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<p>
		<?php 
    _e('Aspect ratio:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" style="width:3em;" />
		:
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" style="width:3em;" />
		</span>
	</p>

	<p id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>">
		<?php 
    _e('Selection:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		&times;
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		</span>
	</p>
	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h3><?php 
        _e('Thumbnail Settings');
        ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
		<p class="imgedit-help"><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
	</div>

	<p>
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<br /><?php 
        _e('Current thumbnail');
        ?>
	</p>

	<p id="imgedit-save-target-<?php 
        echo $post_id;
        ?>">
		<strong><?php 
        _e('Apply changes to:');
        ?></strong><br />

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
		<?php 
        _e('All image sizes');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
		<?php 
        _e('Thumbnail');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
		<?php 
        _e('All sizes except thumbnail');
        ?></label>
	</p>
	</div>

	<?php 
    }
    ?>

	</div>

	<div class="imgedit-panel-content">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu">
			<div onclick="imageEdit.crop(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-crop disabled" title="<?php 
    esc_attr_e('Crop');
    ?>"></div><?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        ?>
			<div class="imgedit-rleft"  onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate counter-clockwise');
        ?>"></div>
			<div class="imgedit-rright" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate clockwise');
        ?>"></div>
	<?php 
    } else {
        $note_no_rotate = esc_attr__('Image rotation is not supported by your web host.');
        ?>
		    <div class="imgedit-rleft disabled"  title="<?php 
        echo $note_no_rotate;
        ?>"></div>
		    <div class="imgedit-rright disabled" title="<?php 
        echo $note_no_rotate;
        ?>"></div>
	<?php 
    }
    ?>

			<div onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv" title="<?php 
    esc_attr_e('Flip vertically');
    ?>"></div>
			<div onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph" title="<?php 
    esc_attr_e('Flip horizontally');
    ?>"></div>

			<div id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo disabled" title="<?php 
    esc_attr_e('Undo');
    ?>"></div>
			<div id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo disabled" title="<?php 
    esc_attr_e('Redo');
    ?>"></div>
			<br class="clear" />
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<script type="text/javascript">jQuery( function() { imageEdit.init(<?php 
    echo $post_id;
    ?>); });</script>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
<?php 
}

WordPress Version: 4.0

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = $backup_sizes['full-orig']['file'] != basename($meta['file']);
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><?php 
    _e('Scale Image');
    ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p><?php 
        printf(__('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height']);
        ?></p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">
		<span class="nowrap"><input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" style="width:4em;" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" /> &times; <input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" style="width:4em;" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span></span>
		<input type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" />
		</div>
	</div>
	</div>

<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><a onclick="imageEdit.toggleHelp(this);return false;" href="#"><?php 
        _e('Restore Original Image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></a></h3>
		<div class="imgedit-help">
		<p><?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?></p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><?php 
    _e('Image Crop');
    ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<p>
		<?php 
    _e('Aspect ratio:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" style="width:3em;" />
		:
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" style="width:3em;" />
		</span>
	</p>

	<p id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>">
		<?php 
    _e('Selection:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		&times;
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		</span>
	</p>
	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h3><?php 
        _e('Thumbnail Settings');
        ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
		<p class="imgedit-help"><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
	</div>

	<p>
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<br /><?php 
        _e('Current thumbnail');
        ?>
	</p>

	<p id="imgedit-save-target-<?php 
        echo $post_id;
        ?>">
		<strong><?php 
        _e('Apply changes to:');
        ?></strong><br />

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
		<?php 
        _e('All image sizes');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
		<?php 
        _e('Thumbnail');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
		<?php 
        _e('All sizes except thumbnail');
        ?></label>
	</p>
	</div>

	<?php 
    }
    ?>

	</div>

	<div class="imgedit-panel-content">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu">
			<div onclick="imageEdit.crop(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-crop disabled" title="<?php 
    esc_attr_e('Crop');
    ?>"></div><?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        ?>
			<div class="imgedit-rleft"  onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate counter-clockwise');
        ?>"></div>
			<div class="imgedit-rright" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate clockwise');
        ?>"></div>
	<?php 
    } else {
        $note_no_rotate = esc_attr__('Image rotation is not supported by your web host.');
        ?>
		    <div class="imgedit-rleft disabled"  title="<?php 
        echo $note_no_rotate;
        ?>"></div>
		    <div class="imgedit-rright disabled" title="<?php 
        echo $note_no_rotate;
        ?>"></div>
	<?php 
    }
    ?>

			<div onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv" title="<?php 
    esc_attr_e('Flip vertically');
    ?>"></div>
			<div onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph" title="<?php 
    esc_attr_e('Flip horizontally');
    ?>"></div>

			<div id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo disabled" title="<?php 
    esc_attr_e('Undo');
    ?>"></div>
			<div id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo disabled" title="<?php 
    esc_attr_e('Redo');
    ?>"></div>
			<br class="clear" />
		</div>

		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" />
		</div>

		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>

	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<script type="text/javascript">jQuery( function() { imageEdit.init(<?php 
    echo $post_id;
    ?>); });</script>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
<?php 
}

WordPress Version: 3.9

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = $backup_sizes['full-orig']['file'] != basename($meta['file']);
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap">
	<div id="imgedit-panel-<?php 
    echo $post_id;
    ?>">

	<div class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><?php 
    _e('Scale Image');
    ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.');
    ?></p>
		</div>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p><?php 
        printf(__('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height']);
        ?></p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">
		<span class="nowrap"><input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" style="width:4em;" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" /> &times; <input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" style="width:4em;" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span></span>
		<input type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" />
		</div>
	</div>
	</div>

<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><a onclick="imageEdit.toggleHelp(this);return false;" href="#"><?php 
        _e('Restore Original Image');
        ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></a></h3>
		<div class="imgedit-help">
		<p><?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?></p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>
	</div>

<?php 
    }
    ?>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<h3><?php 
    _e('Image Crop');
    ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>

		<div class="imgedit-help">
		<p><?php 
    _e('To crop the image, click on it and drag to make your selection.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<p>
		<?php 
    _e('Aspect ratio:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" style="width:3em;" />
		:
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" style="width:3em;" />
		</span>
	</p>

	<p id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>">
		<?php 
    _e('Selection:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		&times;
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		</span>
	</p>
	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<h3><?php 
        _e('Thumbnail Settings');
        ?> <a href="#" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;"></a></h3>
		<p class="imgedit-help"><?php 
        _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.');
        ?></p>
	</div>

	<p>
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" draggable="false" />
		<br /><?php 
        _e('Current thumbnail');
        ?>
	</p>

	<p id="imgedit-save-target-<?php 
        echo $post_id;
        ?>">
		<strong><?php 
        _e('Apply changes to:');
        ?></strong><br />

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
		<?php 
        _e('All image sizes');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
		<?php 
        _e('Thumbnail');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
		<?php 
        _e('All sizes except thumbnail');
        ?></label>
	</p>
	</div>

	<?php 
    }
    ?>

	</div>
	
	<div class="imgedit-panel-content">
		<?php 
    echo $note;
    ?>
		<div class="imgedit-menu">
			<div onclick="imageEdit.crop(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-crop disabled" title="<?php 
    esc_attr_e('Crop');
    ?>"></div><?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        ?>
			<div class="imgedit-rleft"  onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate counter-clockwise');
        ?>"></div>
			<div class="imgedit-rright" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate clockwise');
        ?>"></div>
	<?php 
    } else {
        $note_no_rotate = esc_attr__('Image rotation is not supported by your web host.');
        ?>
		    <div class="imgedit-rleft disabled"  title="<?php 
        echo $note_no_rotate;
        ?>"></div>
		    <div class="imgedit-rright disabled" title="<?php 
        echo $note_no_rotate;
        ?>"></div>
	<?php 
    }
    ?>
	
			<div onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv" title="<?php 
    esc_attr_e('Flip vertically');
    ?>"></div>
			<div onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph" title="<?php 
    esc_attr_e('Flip horizontally');
    ?>"></div>
	
			<div id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo disabled" title="<?php 
    esc_attr_e('Undo');
    ?>"></div>
			<div id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo disabled" title="<?php 
    esc_attr_e('Redo');
    ?>"></div>
			<br class="clear" />
		</div>
	
		<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
		<input type="hidden" id="imgedit-minthumb-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo get_option('thumbnail_size_w') . ':' . get_option('thumbnail_size_h');
    ?>" />
		<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
		<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
		<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
		<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
	
		<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
		<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" />
		</div>
	
		<div class="imgedit-submit">
			<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
			<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
		</div>
	</div>
	
	</div>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<script type="text/javascript">jQuery( function() { imageEdit.init(<?php 
    echo $post_id;
    ?>); });</script>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
<?php 
}

WordPress Version: 3.7

/**
 * WordPress Image Editor
 *
 * @package WordPress
 * @subpackage Administration
 */
function wp_image_editor($post_id, $msg = false)
{
    $nonce = wp_create_nonce("image_editor-{$post_id}");
    $meta = wp_get_attachment_metadata($post_id);
    $thumb = image_get_intermediate_size($post_id, 'thumbnail');
    $sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);
    $note = '';
    if (isset($meta['width'], $meta['height'])) {
        $big = max($meta['width'], $meta['height']);
    } else {
        die(__('Image data does not exist. Please re-upload the image.'));
    }
    $sizer = ($big > 400) ? 400 / $big : 1;
    $backup_sizes = get_post_meta($post_id, '_wp_attachment_backup_sizes', true);
    $can_restore = false;
    if (!empty($backup_sizes) && isset($backup_sizes['full-orig'], $meta['file'])) {
        $can_restore = $backup_sizes['full-orig']['file'] != basename($meta['file']);
    }
    if ($msg) {
        if (isset($msg->error)) {
            $note = "<div class='error'><p>{$msg->error}</p></div>";
        } elseif (isset($msg->msg)) {
            $note = "<div class='updated'><p>{$msg->msg}</p></div>";
        }
    }
    ?>
	<div class="imgedit-wrap">
	<?php 
    echo $note;
    ?>
	<table id="imgedit-panel-<?php 
    echo $post_id;
    ?>"><tbody>
	<tr><td>
	<div class="imgedit-menu">
		<div onclick="imageEdit.crop(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-crop disabled" title="<?php 
    esc_attr_e('Crop');
    ?>"></div><?php 
    // On some setups GD library does not provide imagerotate() - Ticket #11536
    if (wp_image_editor_supports(array('mime_type' => get_post_mime_type($post_id), 'methods' => array('rotate')))) {
        ?>
		<div class="imgedit-rleft"  onclick="imageEdit.rotate( 90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate counter-clockwise');
        ?>"></div>
		<div class="imgedit-rright" onclick="imageEdit.rotate(-90, <?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, this)" title="<?php 
        esc_attr_e('Rotate clockwise');
        ?>"></div>
<?php 
    } else {
        $note_no_rotate = esc_attr__('Image rotation is not supported by your web host.');
        ?>
	    <div class="imgedit-rleft disabled"  title="<?php 
        echo $note_no_rotate;
        ?>"></div>
	    <div class="imgedit-rright disabled" title="<?php 
        echo $note_no_rotate;
        ?>"></div>
<?php 
    }
    ?>

		<div onclick="imageEdit.flip(1, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-flipv" title="<?php 
    esc_attr_e('Flip vertically');
    ?>"></div>
		<div onclick="imageEdit.flip(2, <?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-fliph" title="<?php 
    esc_attr_e('Flip horizontally');
    ?>"></div>

		<div id="image-undo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.undo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-undo disabled" title="<?php 
    esc_attr_e('Undo');
    ?>"></div>
		<div id="image-redo-<?php 
    echo $post_id;
    ?>" onclick="imageEdit.redo(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, this)" class="imgedit-redo disabled" title="<?php 
    esc_attr_e('Redo');
    ?>"></div>
		<br class="clear" />
	</div>

	<input type="hidden" id="imgedit-sizer-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo $sizer;
    ?>" />
	<input type="hidden" id="imgedit-minthumb-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo get_option('thumbnail_size_w') . ':' . get_option('thumbnail_size_h');
    ?>" />
	<input type="hidden" id="imgedit-history-<?php 
    echo $post_id;
    ?>" value="" />
	<input type="hidden" id="imgedit-undone-<?php 
    echo $post_id;
    ?>" value="0" />
	<input type="hidden" id="imgedit-selection-<?php 
    echo $post_id;
    ?>" value="" />
	<input type="hidden" id="imgedit-x-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />
	<input type="hidden" id="imgedit-y-<?php 
    echo $post_id;
    ?>" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />

	<div id="imgedit-crop-<?php 
    echo $post_id;
    ?>" class="imgedit-crop-wrap">
	<img id="image-preview-<?php 
    echo $post_id;
    ?>" onload="imageEdit.imgLoaded('<?php 
    echo $post_id;
    ?>')" src="<?php 
    echo admin_url('admin-ajax.php', 'relative');
    ?>?action=imgedit-preview&amp;_ajax_nonce=<?php 
    echo $nonce;
    ?>&amp;postid=<?php 
    echo $post_id;
    ?>&amp;rand=<?php 
    echo rand(1, 99999);
    ?>" />
	</div>

	<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.close(<?php 
    echo $post_id;
    ?>, 1)" class="button" value="<?php 
    esc_attr_e('Cancel');
    ?>" />
		<input type="button" onclick="imageEdit.save(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>)" disabled="disabled" class="button-primary imgedit-submit-btn" value="<?php 
    esc_attr_e('Save');
    ?>" />
	</div>
	</td>

	<td class="imgedit-settings">
	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<a class="imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" href="#"><strong><?php 
    _e('Scale Image');
    ?></strong></a>
		<div class="imgedit-help">
		<p><?php 
    _e('You can proportionally scale the original image. For best results the scaling should be done before performing any other operations on it like crop, rotate, etc. Note that images can only be scaled down, not up.');
    ?></p>
		<?php 
    if (isset($meta['width'], $meta['height'])) {
        ?>
		<p><?php 
        printf(__('Original dimensions %s'), $meta['width'] . '&times;' . $meta['height']);
        ?></p>
		<?php 
    }
    ?>
		<div class="imgedit-submit">
		<span class="nowrap"><input type="text" id="imgedit-scale-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 1)" style="width:4em;" value="<?php 
    echo isset($meta['width']) ? $meta['width'] : 0;
    ?>" />&times;<input type="text" id="imgedit-scale-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" onblur="imageEdit.scaleChanged(<?php 
    echo $post_id;
    ?>, 0)" style="width:4em;" value="<?php 
    echo isset($meta['height']) ? $meta['height'] : 0;
    ?>" />
		<span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php 
    echo $post_id;
    ?>">!</span></span>
		<input type="button" onclick="imageEdit.action(<?php 
    echo "{$post_id}, '{$nonce}'";
    ?>, 'scale')" class="button-primary" value="<?php 
    esc_attr_e('Scale');
    ?>" />
		</div>
		</div>
	</div>

<?php 
    if ($can_restore) {
        ?>

	<div class="imgedit-group-top">
		<a class="imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" href="#"><strong><?php 
        _e('Restore Original Image');
        ?></strong></a>
		<div class="imgedit-help">
		<p><?php 
        _e('Discard any changes and restore the original image.');
        if (!defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE) {
            echo ' ' . __('Previously edited copies of the image will not be deleted.');
        }
        ?></p>
		<div class="imgedit-submit">
		<input type="button" onclick="imageEdit.action(<?php 
        echo "{$post_id}, '{$nonce}'";
        ?>, 'restore')" class="button-primary" value="<?php 
        esc_attr_e('Restore image');
        ?>" <?php 
        echo $can_restore;
        ?> />
		</div>
		</div>
	</div>

<?php 
    }
    ?>

	</div>

	<div class="imgedit-group">
	<div class="imgedit-group-top">
		<strong><?php 
    _e('Image Crop');
    ?></strong>
		<a class="imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" href="#"><?php 
    _e('(help)');
    ?></a>
		<div class="imgedit-help">
		<p><?php 
    _e('The image can be cropped by clicking on it and dragging to select the desired part. While dragging the dimensions of the selection are displayed below.');
    ?></p>

		<p><strong><?php 
    _e('Crop Aspect Ratio');
    ?></strong><br />
		<?php 
    _e('You can specify the crop selection aspect ratio then hold down the Shift key while dragging to lock it. The values can be 1:1 (square), 4:3, 16:9, etc. If there is a selection, specifying aspect ratio will set it immediately.');
    ?></p>

		<p><strong><?php 
    _e('Crop Selection');
    ?></strong><br />
		<?php 
    _e('Once started, the selection can be adjusted by entering new values (in pixels). Note that these values are scaled to approximately match the original image dimensions. The minimum selection size equals the thumbnail size as set in the Media settings.');
    ?></p>
		</div>
	</div>

	<p>
		<?php 
    _e('Aspect ratio:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-crop-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 0, this)" style="width:3em;" />
		:
		<input type="text" id="imgedit-crop-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setRatioSelection(<?php 
    echo $post_id;
    ?>, 1, this)" style="width:3em;" />
		</span>
	</p>

	<p id="imgedit-crop-sel-<?php 
    echo $post_id;
    ?>">
		<?php 
    _e('Selection:');
    ?>
		<span  class="nowrap">
		<input type="text" id="imgedit-sel-width-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		:
		<input type="text" id="imgedit-sel-height-<?php 
    echo $post_id;
    ?>" onkeyup="imageEdit.setNumSelection(<?php 
    echo $post_id;
    ?>)" style="width:4em;" />
		</span>
	</p>
	</div>

	<?php 
    if ($thumb && $sub_sizes) {
        $thumb_img = wp_constrain_dimensions($thumb['width'], $thumb['height'], 160, 120);
        ?>

	<div class="imgedit-group imgedit-applyto">
	<div class="imgedit-group-top">
		<strong><?php 
        _e('Thumbnail Settings');
        ?></strong>
		<a class="imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);return false;" href="#"><?php 
        _e('(help)');
        ?></a>
		<p class="imgedit-help"><?php 
        _e('The thumbnail image can be cropped differently. For example it can be square or contain only a portion of the original image to showcase it better. Here you can select whether to apply changes to all image sizes or make the thumbnail different.');
        ?></p>
	</div>

	<p>
		<img src="<?php 
        echo $thumb['url'];
        ?>" width="<?php 
        echo $thumb_img[0];
        ?>" height="<?php 
        echo $thumb_img[1];
        ?>" class="imgedit-size-preview" alt="" /><br /><?php 
        _e('Current thumbnail');
        ?>
	</p>

	<p id="imgedit-save-target-<?php 
        echo $post_id;
        ?>">
		<strong><?php 
        _e('Apply changes to:');
        ?></strong><br />

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="all" checked="checked" />
		<?php 
        _e('All image sizes');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="thumbnail" />
		<?php 
        _e('Thumbnail');
        ?></label>

		<label class="imgedit-label">
		<input type="radio" name="imgedit-target-<?php 
        echo $post_id;
        ?>" value="nothumb" />
		<?php 
        _e('All sizes except thumbnail');
        ?></label>
	</p>
	</div>

	<?php 
    }
    ?>

	</td></tr>
	</tbody></table>
	<div class="imgedit-wait" id="imgedit-wait-<?php 
    echo $post_id;
    ?>"></div>
	<script type="text/javascript">jQuery( function() { imageEdit.init(<?php 
    echo $post_id;
    ?>); });</script>
	<div class="hidden" id="imgedit-leaving-<?php 
    echo $post_id;
    ?>"><?php 
    _e("There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.");
    ?></div>
	</div>
<?php 
}