Пример #1
0
/**
 * 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;
}
Пример #2
0
function image_edit_apply_changes($img, $changes)
{
    if (!is_array($changes)) {
        return $img;
    }
    // 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
    $img = apply_filters('image_edit_before_change', $img, $changes);
    foreach ($changes as $operation) {
        switch ($operation->type) {
            case 'rotate':
                if ($operation->angle != 0) {
                    $img = _rotate_image_resource($img, $operation->angle);
                }
                break;
            case 'flip':
                if ($operation->axis != 0) {
                    $img = _flip_image_resource($img, ($operation->axis & 1) != 0, ($operation->axis & 2) != 0);
                }
                break;
            case 'crop':
                $sel = $operation->sel;
                $scale = 1 / _image_get_preview_ratio(imagesx($img), imagesy($img));
                // discard preview scaling
                $img = _crop_image_resource($img, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale);
                break;
        }
    }
    return $img;
}