image_edit_apply_changes

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

WordPress Version: 6.4

/**
 * Performs group of changes on Editor specified.
 *
 * @since 2.9.0
 *
 * @param WP_Image_Editor $image   WP_Image_Editor instance.
 * @param array           $changes Array of change operations.
 * @return WP_Image_Editor WP_Image_Editor instance with changes applied.
 */
function image_edit_apply_changes($image, $changes)
{
    if (is_gd_image($image)) {
        /* translators: 1: $image, 2: WP_Image_Editor */
        _deprecated_argument(__FUNCTION__, '3.5.0', sprintf(__('%1$s needs to be a %2$s object.'), '$image', 'WP_Image_Editor'));
    }
    if (!is_array($changes)) {
        return $image;
    }
    // Expand change operations.
    foreach ($changes as $key => $obj) {
        if (isset($obj->r)) {
            $obj->type = 'rotate';
            $obj->angle = $obj->r;
            unset($obj->r);
        } elseif (isset($obj->f)) {
            $obj->type = 'flip';
            $obj->axis = $obj->f;
            unset($obj->f);
        } elseif (isset($obj->c)) {
            $obj->type = 'crop';
            $obj->sel = $obj->c;
            unset($obj->c);
        }
        $changes[$key] = $obj;
    }
    // Combine operations.
    if (count($changes) > 1) {
        $filtered = array($changes[0]);
        for ($i = 0, $j = 1, $c = count($changes); $j < $c; $j++) {
            $combined = false;
            if ($filtered[$i]->type === $changes[$j]->type) {
                switch ($filtered[$i]->type) {
                    case 'rotate':
                        $filtered[$i]->angle += $changes[$j]->angle;
                        $combined = true;
                        break;
                    case 'flip':
                        $filtered[$i]->axis ^= $changes[$j]->axis;
                        $combined = true;
                        break;
                }
            }
            if (!$combined) {
                $filtered[++$i] = $changes[$j];
            }
        }
        $changes = $filtered;
        unset($filtered);
    }
    // Image resource before applying the changes.
    if ($image instanceof WP_Image_Editor) {
        /**
         * Filters the WP_Image_Editor instance before applying changes to the image.
         *
         * @since 3.5.0
         *
         * @param WP_Image_Editor $image   WP_Image_Editor instance.
         * @param array           $changes Array of change operations.
         */
        $image = apply_filters('wp_image_editor_before_change', $image, $changes);
    } elseif (is_gd_image($image)) {
        /**
         * Filters the GD image resource before applying changes to the image.
         *
         * @since 2.9.0
         * @deprecated 3.5.0 Use {@see 'wp_image_editor_before_change'} instead.
         *
         * @param resource|GdImage $image   GD image resource or GdImage instance.
         * @param array            $changes Array of change operations.
         */
        $image = apply_filters_deprecated('image_edit_before_change', array($image, $changes), '3.5.0', 'wp_image_editor_before_change');
    }
    foreach ($changes as $operation) {
        switch ($operation->type) {
            case 'rotate':
                if (0 !== $operation->angle) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->rotate($operation->angle);
                    } else {
                        $image = _rotate_image_resource($image, $operation->angle);
                    }
                }
                break;
            case 'flip':
                if (0 !== $operation->axis) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->flip(($operation->axis & 1) !== 0, ($operation->axis & 2) !== 0);
                    } else {
                        $image = _flip_image_resource($image, ($operation->axis & 1) !== 0, ($operation->axis & 2) !== 0);
                    }
                }
                break;
            case 'crop':
                $sel = $operation->sel;
                if ($image instanceof WP_Image_Editor) {
                    $size = $image->get_size();
                    $w = $size['width'];
                    $h = $size['height'];
                    $scale = 1 / _image_get_preview_ratio($w, $h);
                    // Discard preview scaling.
                    $image->crop($sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                } else {
                    $scale = 1 / _image_get_preview_ratio(imagesx($image), imagesy($image));
                    // Discard preview scaling.
                    $image = _crop_image_resource($image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                }
                break;
        }
    }
    return $image;
}

WordPress Version: 5.6

/**
 * Performs group of changes on Editor specified.
 *
 * @since 2.9.0
 *
 * @param WP_Image_Editor $image   WP_Image_Editor instance.
 * @param array           $changes Array of change operations.
 * @return WP_Image_Editor WP_Image_Editor instance with changes applied.
 */
function image_edit_apply_changes($image, $changes)
{
    if (is_gd_image($image)) {
        /* translators: 1: $image, 2: WP_Image_Editor */
        _deprecated_argument(__FUNCTION__, '3.5.0', sprintf(__('%1$s needs to be a %2$s object.'), '$image', 'WP_Image_Editor'));
    }
    if (!is_array($changes)) {
        return $image;
    }
    // Expand change operations.
    foreach ($changes as $key => $obj) {
        if (isset($obj->r)) {
            $obj->type = 'rotate';
            $obj->angle = $obj->r;
            unset($obj->r);
        } elseif (isset($obj->f)) {
            $obj->type = 'flip';
            $obj->axis = $obj->f;
            unset($obj->f);
        } elseif (isset($obj->c)) {
            $obj->type = 'crop';
            $obj->sel = $obj->c;
            unset($obj->c);
        }
        $changes[$key] = $obj;
    }
    // Combine operations.
    if (count($changes) > 1) {
        $filtered = array($changes[0]);
        for ($i = 0, $j = 1, $c = count($changes); $j < $c; $j++) {
            $combined = false;
            if ($filtered[$i]->type == $changes[$j]->type) {
                switch ($filtered[$i]->type) {
                    case 'rotate':
                        $filtered[$i]->angle += $changes[$j]->angle;
                        $combined = true;
                        break;
                    case 'flip':
                        $filtered[$i]->axis ^= $changes[$j]->axis;
                        $combined = true;
                        break;
                }
            }
            if (!$combined) {
                $filtered[++$i] = $changes[$j];
            }
        }
        $changes = $filtered;
        unset($filtered);
    }
    // Image resource before applying the changes.
    if ($image instanceof WP_Image_Editor) {
        /**
         * Filters the WP_Image_Editor instance before applying changes to the image.
         *
         * @since 3.5.0
         *
         * @param WP_Image_Editor $image   WP_Image_Editor instance.
         * @param array           $changes Array of change operations.
         */
        $image = apply_filters('wp_image_editor_before_change', $image, $changes);
    } elseif (is_gd_image($image)) {
        /**
         * Filters the GD image resource before applying changes to the image.
         *
         * @since 2.9.0
         * @deprecated 3.5.0 Use {@see 'wp_image_editor_before_change'} instead.
         *
         * @param resource|GdImage $image   GD image resource or GdImage instance.
         * @param array            $changes Array of change operations.
         */
        $image = apply_filters_deprecated('image_edit_before_change', array($image, $changes), '3.5.0', 'wp_image_editor_before_change');
    }
    foreach ($changes as $operation) {
        switch ($operation->type) {
            case 'rotate':
                if (0 != $operation->angle) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->rotate($operation->angle);
                    } else {
                        $image = _rotate_image_resource($image, $operation->angle);
                    }
                }
                break;
            case 'flip':
                if (0 != $operation->axis) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->flip(($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    } else {
                        $image = _flip_image_resource($image, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    }
                }
                break;
            case 'crop':
                $sel = $operation->sel;
                if ($image instanceof WP_Image_Editor) {
                    $size = $image->get_size();
                    $w = $size['width'];
                    $h = $size['height'];
                    $scale = 1 / _image_get_preview_ratio($w, $h);
                    // Discard preview scaling.
                    $image->crop($sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                } else {
                    $scale = 1 / _image_get_preview_ratio(imagesx($image), imagesy($image));
                    // Discard preview scaling.
                    $image = _crop_image_resource($image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                }
                break;
        }
    }
    return $image;
}

WordPress Version: 5.4

/**
 * Performs group of changes on Editor specified.
 *
 * @since 2.9.0
 *
 * @param WP_Image_Editor $image   WP_Image_Editor instance.
 * @param array           $changes Array of change operations.
 * @return WP_Image_Editor WP_Image_Editor instance with changes applied.
 */
function image_edit_apply_changes($image, $changes)
{
    if (is_resource($image)) {
        /* translators: 1: $image, 2: WP_Image_Editor */
        _deprecated_argument(__FUNCTION__, '3.5.0', sprintf(__('%1$s needs to be a %2$s object.'), '$image', 'WP_Image_Editor'));
    }
    if (!is_array($changes)) {
        return $image;
    }
    // Expand change operations.
    foreach ($changes as $key => $obj) {
        if (isset($obj->r)) {
            $obj->type = 'rotate';
            $obj->angle = $obj->r;
            unset($obj->r);
        } elseif (isset($obj->f)) {
            $obj->type = 'flip';
            $obj->axis = $obj->f;
            unset($obj->f);
        } elseif (isset($obj->c)) {
            $obj->type = 'crop';
            $obj->sel = $obj->c;
            unset($obj->c);
        }
        $changes[$key] = $obj;
    }
    // Combine operations.
    if (count($changes) > 1) {
        $filtered = array($changes[0]);
        for ($i = 0, $j = 1, $c = count($changes); $j < $c; $j++) {
            $combined = false;
            if ($filtered[$i]->type == $changes[$j]->type) {
                switch ($filtered[$i]->type) {
                    case 'rotate':
                        $filtered[$i]->angle += $changes[$j]->angle;
                        $combined = true;
                        break;
                    case 'flip':
                        $filtered[$i]->axis ^= $changes[$j]->axis;
                        $combined = true;
                        break;
                }
            }
            if (!$combined) {
                $filtered[++$i] = $changes[$j];
            }
        }
        $changes = $filtered;
        unset($filtered);
    }
    // Image resource before applying the changes.
    if ($image instanceof WP_Image_Editor) {
        /**
         * Filters the WP_Image_Editor instance before applying changes to the image.
         *
         * @since 3.5.0
         *
         * @param WP_Image_Editor $image   WP_Image_Editor instance.
         * @param array           $changes Array of change operations.
         */
        $image = apply_filters('wp_image_editor_before_change', $image, $changes);
    } elseif (is_resource($image)) {
        /**
         * Filters the GD image resource before applying changes to the image.
         *
         * @since 2.9.0
         * @deprecated 3.5.0 Use {@see 'wp_image_editor_before_change'} instead.
         *
         * @param resource $image   GD image resource.
         * @param array    $changes Array of change operations.
         */
        $image = apply_filters_deprecated('image_edit_before_change', array($image, $changes), '3.5.0', 'wp_image_editor_before_change');
    }
    foreach ($changes as $operation) {
        switch ($operation->type) {
            case 'rotate':
                if (0 != $operation->angle) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->rotate($operation->angle);
                    } else {
                        $image = _rotate_image_resource($image, $operation->angle);
                    }
                }
                break;
            case 'flip':
                if (0 != $operation->axis) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->flip(($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    } else {
                        $image = _flip_image_resource($image, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    }
                }
                break;
            case 'crop':
                $sel = $operation->sel;
                if ($image instanceof WP_Image_Editor) {
                    $size = $image->get_size();
                    $w = $size['width'];
                    $h = $size['height'];
                    $scale = 1 / _image_get_preview_ratio($w, $h);
                    // Discard preview scaling.
                    $image->crop($sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                } else {
                    $scale = 1 / _image_get_preview_ratio(imagesx($image), imagesy($image));
                    // Discard preview scaling.
                    $image = _crop_image_resource($image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                }
                break;
        }
    }
    return $image;
}

WordPress Version: 5.3

/**
 * Performs group of changes on Editor specified.
 *
 * @since 2.9.0
 *
 * @param WP_Image_Editor $image   WP_Image_Editor instance.
 * @param array           $changes Array of change operations.
 * @return WP_Image_Editor WP_Image_Editor instance with changes applied.
 */
function image_edit_apply_changes($image, $changes)
{
    if (is_resource($image)) {
        /* translators: 1: $image, 2: WP_Image_Editor */
        _deprecated_argument(__FUNCTION__, '3.5.0', sprintf(__('%1$s needs to be a %2$s object.'), '$image', 'WP_Image_Editor'));
    }
    if (!is_array($changes)) {
        return $image;
    }
    // Expand change operations.
    foreach ($changes as $key => $obj) {
        if (isset($obj->r)) {
            $obj->type = 'rotate';
            $obj->angle = $obj->r;
            unset($obj->r);
        } elseif (isset($obj->f)) {
            $obj->type = 'flip';
            $obj->axis = $obj->f;
            unset($obj->f);
        } elseif (isset($obj->c)) {
            $obj->type = 'crop';
            $obj->sel = $obj->c;
            unset($obj->c);
        }
        $changes[$key] = $obj;
    }
    // Combine operations.
    if (count($changes) > 1) {
        $filtered = array($changes[0]);
        for ($i = 0, $j = 1, $c = count($changes); $j < $c; $j++) {
            $combined = false;
            if ($filtered[$i]->type == $changes[$j]->type) {
                switch ($filtered[$i]->type) {
                    case 'rotate':
                        $filtered[$i]->angle += $changes[$j]->angle;
                        $combined = true;
                        break;
                    case 'flip':
                        $filtered[$i]->axis ^= $changes[$j]->axis;
                        $combined = true;
                        break;
                }
            }
            if (!$combined) {
                $filtered[++$i] = $changes[$j];
            }
        }
        $changes = $filtered;
        unset($filtered);
    }
    // Image resource before applying the changes.
    if ($image instanceof WP_Image_Editor) {
        /**
         * Filters the WP_Image_Editor instance before applying changes to the image.
         *
         * @since 3.5.0
         *
         * @param WP_Image_Editor $image   WP_Image_Editor instance.
         * @param array           $changes Array of change operations.
         */
        $image = apply_filters('wp_image_editor_before_change', $image, $changes);
    } elseif (is_resource($image)) {
        /**
         * Filters the GD image resource before applying changes to the image.
         *
         * @since 2.9.0
         * @deprecated 3.5.0 Use wp_image_editor_before_change instead.
         *
         * @param resource $image   GD image resource.
         * @param array    $changes Array of change operations.
         */
        $image = apply_filters('image_edit_before_change', $image, $changes);
    }
    foreach ($changes as $operation) {
        switch ($operation->type) {
            case 'rotate':
                if ($operation->angle != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->rotate($operation->angle);
                    } else {
                        $image = _rotate_image_resource($image, $operation->angle);
                    }
                }
                break;
            case 'flip':
                if ($operation->axis != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->flip(($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    } else {
                        $image = _flip_image_resource($image, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    }
                }
                break;
            case 'crop':
                $sel = $operation->sel;
                if ($image instanceof WP_Image_Editor) {
                    $size = $image->get_size();
                    $w = $size['width'];
                    $h = $size['height'];
                    $scale = 1 / _image_get_preview_ratio($w, $h);
                    // discard preview scaling
                    $image->crop($sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                } else {
                    $scale = 1 / _image_get_preview_ratio(imagesx($image), imagesy($image));
                    // discard preview scaling
                    $image = _crop_image_resource($image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                }
                break;
        }
    }
    return $image;
}

WordPress Version: 4.6

/**
 * Performs group of changes on Editor specified.
 *
 * @since 2.9.0
 *
 * @param WP_Image_Editor $image   WP_Image_Editor instance.
 * @param array           $changes Array of change operations.
 * @return WP_Image_Editor WP_Image_Editor instance with changes applied.
 */
function image_edit_apply_changes($image, $changes)
{
    if (is_resource($image)) {
        _deprecated_argument(__FUNCTION__, '3.5.0', __('$image needs to be an WP_Image_Editor object'));
    }
    if (!is_array($changes)) {
        return $image;
    }
    // Expand change operations.
    foreach ($changes as $key => $obj) {
        if (isset($obj->r)) {
            $obj->type = 'rotate';
            $obj->angle = $obj->r;
            unset($obj->r);
        } elseif (isset($obj->f)) {
            $obj->type = 'flip';
            $obj->axis = $obj->f;
            unset($obj->f);
        } elseif (isset($obj->c)) {
            $obj->type = 'crop';
            $obj->sel = $obj->c;
            unset($obj->c);
        }
        $changes[$key] = $obj;
    }
    // Combine operations.
    if (count($changes) > 1) {
        $filtered = array($changes[0]);
        for ($i = 0, $j = 1, $c = count($changes); $j < $c; $j++) {
            $combined = false;
            if ($filtered[$i]->type == $changes[$j]->type) {
                switch ($filtered[$i]->type) {
                    case 'rotate':
                        $filtered[$i]->angle += $changes[$j]->angle;
                        $combined = true;
                        break;
                    case 'flip':
                        $filtered[$i]->axis ^= $changes[$j]->axis;
                        $combined = true;
                        break;
                }
            }
            if (!$combined) {
                $filtered[++$i] = $changes[$j];
            }
        }
        $changes = $filtered;
        unset($filtered);
    }
    // Image resource before applying the changes.
    if ($image instanceof WP_Image_Editor) {
        /**
         * Filters the WP_Image_Editor instance before applying changes to the image.
         *
         * @since 3.5.0
         *
         * @param WP_Image_Editor $image   WP_Image_Editor instance.
         * @param array           $changes Array of change operations.
         */
        $image = apply_filters('wp_image_editor_before_change', $image, $changes);
    } elseif (is_resource($image)) {
        /**
         * Filters the GD image resource before applying changes to the image.
         *
         * @since 2.9.0
         * @deprecated 3.5.0 Use wp_image_editor_before_change instead.
         *
         * @param resource $image   GD image resource.
         * @param array    $changes Array of change operations.
         */
        $image = apply_filters('image_edit_before_change', $image, $changes);
    }
    foreach ($changes as $operation) {
        switch ($operation->type) {
            case 'rotate':
                if ($operation->angle != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->rotate($operation->angle);
                    } else {
                        $image = _rotate_image_resource($image, $operation->angle);
                    }
                }
                break;
            case 'flip':
                if ($operation->axis != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->flip(($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    } else {
                        $image = _flip_image_resource($image, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    }
                }
                break;
            case 'crop':
                $sel = $operation->sel;
                if ($image instanceof WP_Image_Editor) {
                    $size = $image->get_size();
                    $w = $size['width'];
                    $h = $size['height'];
                    $scale = 1 / _image_get_preview_ratio($w, $h);
                    // discard preview scaling
                    $image->crop($sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                } else {
                    $scale = 1 / _image_get_preview_ratio(imagesx($image), imagesy($image));
                    // discard preview scaling
                    $image = _crop_image_resource($image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                }
                break;
        }
    }
    return $image;
}

WordPress Version: 4.2

/**
 * Performs group of changes on Editor specified.
 *
 * @since 2.9.0
 *
 * @param WP_Image_Editor $image   {@see WP_Image_Editor} instance.
 * @param array           $changes Array of change operations.
 * @return WP_Image_Editor {@see WP_Image_Editor} instance with changes applied.
 */
function image_edit_apply_changes($image, $changes)
{
    if (is_resource($image)) {
        _deprecated_argument(__FUNCTION__, '3.5', __('$image needs to be an WP_Image_Editor object'));
    }
    if (!is_array($changes)) {
        return $image;
    }
    // Expand change operations.
    foreach ($changes as $key => $obj) {
        if (isset($obj->r)) {
            $obj->type = 'rotate';
            $obj->angle = $obj->r;
            unset($obj->r);
        } elseif (isset($obj->f)) {
            $obj->type = 'flip';
            $obj->axis = $obj->f;
            unset($obj->f);
        } elseif (isset($obj->c)) {
            $obj->type = 'crop';
            $obj->sel = $obj->c;
            unset($obj->c);
        }
        $changes[$key] = $obj;
    }
    // Combine operations.
    if (count($changes) > 1) {
        $filtered = array($changes[0]);
        for ($i = 0, $j = 1, $c = count($changes); $j < $c; $j++) {
            $combined = false;
            if ($filtered[$i]->type == $changes[$j]->type) {
                switch ($filtered[$i]->type) {
                    case 'rotate':
                        $filtered[$i]->angle += $changes[$j]->angle;
                        $combined = true;
                        break;
                    case 'flip':
                        $filtered[$i]->axis ^= $changes[$j]->axis;
                        $combined = true;
                        break;
                }
            }
            if (!$combined) {
                $filtered[++$i] = $changes[$j];
            }
        }
        $changes = $filtered;
        unset($filtered);
    }
    // Image resource before applying the changes.
    if ($image instanceof WP_Image_Editor) {
        /**
         * Filter the WP_Image_Editor instance before applying changes to the image.
         *
         * @since 3.5.0
         *
         * @param WP_Image_Editor $image   WP_Image_Editor instance.
         * @param array           $changes Array of change operations.
         */
        $image = apply_filters('wp_image_editor_before_change', $image, $changes);
    } elseif (is_resource($image)) {
        /**
         * Filter the GD image resource before applying changes to the image.
         *
         * @since 2.9.0
         * @deprecated 3.5.0 Use wp_image_editor_before_change instead.
         *
         * @param resource $image   GD image resource.
         * @param array    $changes Array of change operations.
         */
        $image = apply_filters('image_edit_before_change', $image, $changes);
    }
    foreach ($changes as $operation) {
        switch ($operation->type) {
            case 'rotate':
                if ($operation->angle != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->rotate($operation->angle);
                    } else {
                        $image = _rotate_image_resource($image, $operation->angle);
                    }
                }
                break;
            case 'flip':
                if ($operation->axis != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->flip(($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    } else {
                        $image = _flip_image_resource($image, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    }
                }
                break;
            case 'crop':
                $sel = $operation->sel;
                if ($image instanceof WP_Image_Editor) {
                    $size = $image->get_size();
                    $w = $size['width'];
                    $h = $size['height'];
                    $scale = 1 / _image_get_preview_ratio($w, $h);
                    // discard preview scaling
                    $image->crop($sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                } else {
                    $scale = 1 / _image_get_preview_ratio(imagesx($image), imagesy($image));
                    // discard preview scaling
                    $image = _crop_image_resource($image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                }
                break;
        }
    }
    return $image;
}

WordPress Version: 4.1

/**
 * Performs group of changes on Editor specified.
 *
 * @since 2.9.0
 *
 * @param WP_Image_Editor $image   {@see WP_Image_Editor} instance.
 * @param array           $changes Array of change operations.
 * @return WP_Image_Editor {@see WP_Image_Editor} instance with changes applied.
 */
function image_edit_apply_changes($image, $changes)
{
    if (is_resource($image)) {
        _deprecated_argument(__FUNCTION__, '3.5', __('$image needs to be an WP_Image_Editor object'));
    }
    if (!is_array($changes)) {
        return $image;
    }
    // Expand change operations.
    foreach ($changes as $key => $obj) {
        if (isset($obj->r)) {
            $obj->type = 'rotate';
            $obj->angle = $obj->r;
            unset($obj->r);
        } elseif (isset($obj->f)) {
            $obj->type = 'flip';
            $obj->axis = $obj->f;
            unset($obj->f);
        } elseif (isset($obj->c)) {
            $obj->type = 'crop';
            $obj->sel = $obj->c;
            unset($obj->c);
        }
        $changes[$key] = $obj;
    }
    // Combine operations.
    if (count($changes) > 1) {
        $filtered = array($changes[0]);
        for ($i = 0, $j = 1; $j < count($changes); $j++) {
            $combined = false;
            if ($filtered[$i]->type == $changes[$j]->type) {
                switch ($filtered[$i]->type) {
                    case 'rotate':
                        $filtered[$i]->angle += $changes[$j]->angle;
                        $combined = true;
                        break;
                    case 'flip':
                        $filtered[$i]->axis ^= $changes[$j]->axis;
                        $combined = true;
                        break;
                }
            }
            if (!$combined) {
                $filtered[++$i] = $changes[$j];
            }
        }
        $changes = $filtered;
        unset($filtered);
    }
    // Image resource before applying the changes.
    if ($image instanceof WP_Image_Editor) {
        /**
         * Filter the WP_Image_Editor instance before applying changes to the image.
         *
         * @since 3.5.0
         *
         * @param WP_Image_Editor $image   WP_Image_Editor instance.
         * @param array           $changes Array of change operations.
         */
        $image = apply_filters('wp_image_editor_before_change', $image, $changes);
    } elseif (is_resource($image)) {
        /**
         * Filter the GD image resource before applying changes to the image.
         *
         * @since 2.9.0
         * @deprecated 3.5.0 Use wp_image_editor_before_change instead.
         *
         * @param resource $image   GD image resource.
         * @param array    $changes Array of change operations.
         */
        $image = apply_filters('image_edit_before_change', $image, $changes);
    }
    foreach ($changes as $operation) {
        switch ($operation->type) {
            case 'rotate':
                if ($operation->angle != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->rotate($operation->angle);
                    } else {
                        $image = _rotate_image_resource($image, $operation->angle);
                    }
                }
                break;
            case 'flip':
                if ($operation->axis != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->flip(($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    } else {
                        $image = _flip_image_resource($image, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    }
                }
                break;
            case 'crop':
                $sel = $operation->sel;
                if ($image instanceof WP_Image_Editor) {
                    $size = $image->get_size();
                    $w = $size['width'];
                    $h = $size['height'];
                    $scale = 1 / _image_get_preview_ratio($w, $h);
                    // discard preview scaling
                    $image->crop($sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                } else {
                    $scale = 1 / _image_get_preview_ratio(imagesx($image), imagesy($image));
                    // discard preview scaling
                    $image = _crop_image_resource($image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                }
                break;
        }
    }
    return $image;
}

WordPress Version: 4.0

/**
 * Performs group of changes on Editor specified.
 *
 * @param WP_Image_Editor $image
 * @param type $changes
 * @return WP_Image_Editor
 */
function image_edit_apply_changes($image, $changes)
{
    if (is_resource($image)) {
        _deprecated_argument(__FUNCTION__, '3.5', __('$image needs to be an WP_Image_Editor object'));
    }
    if (!is_array($changes)) {
        return $image;
    }
    // Expand change operations.
    foreach ($changes as $key => $obj) {
        if (isset($obj->r)) {
            $obj->type = 'rotate';
            $obj->angle = $obj->r;
            unset($obj->r);
        } elseif (isset($obj->f)) {
            $obj->type = 'flip';
            $obj->axis = $obj->f;
            unset($obj->f);
        } elseif (isset($obj->c)) {
            $obj->type = 'crop';
            $obj->sel = $obj->c;
            unset($obj->c);
        }
        $changes[$key] = $obj;
    }
    // Combine operations.
    if (count($changes) > 1) {
        $filtered = array($changes[0]);
        for ($i = 0, $j = 1; $j < count($changes); $j++) {
            $combined = false;
            if ($filtered[$i]->type == $changes[$j]->type) {
                switch ($filtered[$i]->type) {
                    case 'rotate':
                        $filtered[$i]->angle += $changes[$j]->angle;
                        $combined = true;
                        break;
                    case 'flip':
                        $filtered[$i]->axis ^= $changes[$j]->axis;
                        $combined = true;
                        break;
                }
            }
            if (!$combined) {
                $filtered[++$i] = $changes[$j];
            }
        }
        $changes = $filtered;
        unset($filtered);
    }
    // Image resource before applying the changes.
    if ($image instanceof WP_Image_Editor) {
        /**
         * Filter the WP_Image_Editor instance before applying changes to the image.
         *
         * @since 3.5.0
         *
         * @param WP_Image_Editor $image   WP_Image_Editor instance.
         * @param array           $changes Array of change operations.
         */
        $image = apply_filters('wp_image_editor_before_change', $image, $changes);
    } elseif (is_resource($image)) {
        /**
         * Filter the GD image resource before applying changes to the image.
         *
         * @since 2.9.0
         * @deprecated 3.5.0 Use wp_image_editor_before_change instead.
         *
         * @param resource $image   GD image resource.
         * @param array    $changes Array of change operations.
         */
        $image = apply_filters('image_edit_before_change', $image, $changes);
    }
    foreach ($changes as $operation) {
        switch ($operation->type) {
            case 'rotate':
                if ($operation->angle != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->rotate($operation->angle);
                    } else {
                        $image = _rotate_image_resource($image, $operation->angle);
                    }
                }
                break;
            case 'flip':
                if ($operation->axis != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->flip(($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    } else {
                        $image = _flip_image_resource($image, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    }
                }
                break;
            case 'crop':
                $sel = $operation->sel;
                if ($image instanceof WP_Image_Editor) {
                    $size = $image->get_size();
                    $w = $size['width'];
                    $h = $size['height'];
                    $scale = 1 / _image_get_preview_ratio($w, $h);
                    // discard preview scaling
                    $image->crop($sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                } else {
                    $scale = 1 / _image_get_preview_ratio(imagesx($image), imagesy($image));
                    // discard preview scaling
                    $image = _crop_image_resource($image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                }
                break;
        }
    }
    return $image;
}

WordPress Version: 3.9

/**
 * Performs group of changes on Editor specified.
 *
 * @param WP_Image_Editor $image
 * @param type $changes
 * @return WP_Image_Editor
 */
function image_edit_apply_changes($image, $changes)
{
    if (is_resource($image)) {
        _deprecated_argument(__FUNCTION__, '3.5', __('$image needs to be an WP_Image_Editor object'));
    }
    if (!is_array($changes)) {
        return $image;
    }
    // expand change operations
    foreach ($changes as $key => $obj) {
        if (isset($obj->r)) {
            $obj->type = 'rotate';
            $obj->angle = $obj->r;
            unset($obj->r);
        } elseif (isset($obj->f)) {
            $obj->type = 'flip';
            $obj->axis = $obj->f;
            unset($obj->f);
        } elseif (isset($obj->c)) {
            $obj->type = 'crop';
            $obj->sel = $obj->c;
            unset($obj->c);
        }
        $changes[$key] = $obj;
    }
    // combine operations
    if (count($changes) > 1) {
        $filtered = array($changes[0]);
        for ($i = 0, $j = 1; $j < count($changes); $j++) {
            $combined = false;
            if ($filtered[$i]->type == $changes[$j]->type) {
                switch ($filtered[$i]->type) {
                    case 'rotate':
                        $filtered[$i]->angle += $changes[$j]->angle;
                        $combined = true;
                        break;
                    case 'flip':
                        $filtered[$i]->axis ^= $changes[$j]->axis;
                        $combined = true;
                        break;
                }
            }
            if (!$combined) {
                $filtered[++$i] = $changes[$j];
            }
        }
        $changes = $filtered;
        unset($filtered);
    }
    // image resource before applying the changes
    if ($image instanceof WP_Image_Editor) {
        /**
         * Filter the WP_Image_Editor instance before applying changes to the image.
         *
         * @since 3.5.0
         *
         * @param WP_Image_Editor $image   WP_Image_Editor instance.
         * @param array           $changes Array of change operations.
         */
        $image = apply_filters('wp_image_editor_before_change', $image, $changes);
    } elseif (is_resource($image)) {
        /**
         * Filter the GD image resource before applying changes to the image.
         *
         * @since 2.9.0
         * @deprecated 3.5.0 Use wp_image_editor_before_change instead.
         *
         * @param resource $image   GD image resource.
         * @param array    $changes Array of change operations.
         */
        $image = apply_filters('image_edit_before_change', $image, $changes);
    }
    foreach ($changes as $operation) {
        switch ($operation->type) {
            case 'rotate':
                if ($operation->angle != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->rotate($operation->angle);
                    } else {
                        $image = _rotate_image_resource($image, $operation->angle);
                    }
                }
                break;
            case 'flip':
                if ($operation->axis != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->flip(($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    } else {
                        $image = _flip_image_resource($image, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    }
                }
                break;
            case 'crop':
                $sel = $operation->sel;
                if ($image instanceof WP_Image_Editor) {
                    $size = $image->get_size();
                    $w = $size['width'];
                    $h = $size['height'];
                    $scale = 1 / _image_get_preview_ratio($w, $h);
                    // discard preview scaling
                    $image->crop($sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                } else {
                    $scale = 1 / _image_get_preview_ratio(imagesx($image), imagesy($image));
                    // discard preview scaling
                    $image = _crop_image_resource($image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                }
                break;
        }
    }
    return $image;
}

WordPress Version: 3.7

/**
 * Performs group of changes on Editor specified.
 *
 * @param WP_Image_Editor $image
 * @param type $changes
 * @return WP_Image_Editor
 */
function image_edit_apply_changes($image, $changes)
{
    if (is_resource($image)) {
        _deprecated_argument(__FUNCTION__, '3.5', __('$image needs to be an WP_Image_Editor object'));
    }
    if (!is_array($changes)) {
        return $image;
    }
    // expand change operations
    foreach ($changes as $key => $obj) {
        if (isset($obj->r)) {
            $obj->type = 'rotate';
            $obj->angle = $obj->r;
            unset($obj->r);
        } elseif (isset($obj->f)) {
            $obj->type = 'flip';
            $obj->axis = $obj->f;
            unset($obj->f);
        } elseif (isset($obj->c)) {
            $obj->type = 'crop';
            $obj->sel = $obj->c;
            unset($obj->c);
        }
        $changes[$key] = $obj;
    }
    // combine operations
    if (count($changes) > 1) {
        $filtered = array($changes[0]);
        for ($i = 0, $j = 1; $j < count($changes); $j++) {
            $combined = false;
            if ($filtered[$i]->type == $changes[$j]->type) {
                switch ($filtered[$i]->type) {
                    case 'rotate':
                        $filtered[$i]->angle += $changes[$j]->angle;
                        $combined = true;
                        break;
                    case 'flip':
                        $filtered[$i]->axis ^= $changes[$j]->axis;
                        $combined = true;
                        break;
                }
            }
            if (!$combined) {
                $filtered[++$i] = $changes[$j];
            }
        }
        $changes = $filtered;
        unset($filtered);
    }
    // image resource before applying the changes
    if ($image instanceof WP_Image_Editor) {
        $image = apply_filters('wp_image_editor_before_change', $image, $changes);
    } elseif (is_resource($image)) {
        $image = apply_filters('image_edit_before_change', $image, $changes);
    }
    foreach ($changes as $operation) {
        switch ($operation->type) {
            case 'rotate':
                if ($operation->angle != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->rotate($operation->angle);
                    } else {
                        $image = _rotate_image_resource($image, $operation->angle);
                    }
                }
                break;
            case 'flip':
                if ($operation->axis != 0) {
                    if ($image instanceof WP_Image_Editor) {
                        $image->flip(($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    } else {
                        $image = _flip_image_resource($image, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                    }
                }
                break;
            case 'crop':
                $sel = $operation->sel;
                if ($image instanceof WP_Image_Editor) {
                    $size = $image->get_size();
                    $w = $size['width'];
                    $h = $size['height'];
                    $scale = 1 / _image_get_preview_ratio($w, $h);
                    // discard preview scaling
                    $image->crop($sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                } else {
                    $scale = 1 / _image_get_preview_ratio(imagesx($image), imagesy($image));
                    // discard preview scaling
                    $image = _crop_image_resource($image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                }
                break;
        }
    }
    return $image;
}