Обрезать изображение в соответствии с рамкой любого вида - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть изображение, и я хочу обрезать его в соответствии с рамкой любого вида.Например,

Я действительно не могу найти решение.Я искал его в течение 2 дней.

ДО

ПОСЛЕ

РЕДАКТИРОВАНО

Спасибо @Ajharul Islam и @Bence Pattogato.Оба ответа работают.

Быстрая версия решения @Ajharul Islam.

      func images(byCroppingImage image: UIImage?, to size: CGSize) -> UIImage? {
        // not equivalent to image.size (which depends on the imageOrientation)!
        let refWidth = (image?.cgImage?.width)!
        let refHeight = (image?.cgImage?.height)!


        let x = (Double(refWidth) - Double(size.width)) / 2
        let y = (Double(refHeight) - Double(size.height)) / 2



        let cropRect = CGRect(x: CGFloat(x), y: CGFloat(y), width: size.width, height: size.height)


        let imageRef = image?.cgImage!.cropping(to: cropRect) as! CGImage

        var cropped: UIImage? = nil
        if let imageRefs = image?.cgImage!.cropping(to: cropRect) {
            cropped = UIImage(cgImage: imageRefs, scale: 0.0, orientation: UIImage.Orientation.up)
        }


        return cropped
    }

Позвольте мне сказать свою ошибку и то, что я пытался

Я пытался сделать снимок и обрезать его в соответствии с кадром любого вида.Я пытался обрезать картинку без изменения ее размера в соответствии с этим основным видом.Так что каждый раз это было неправильно.

Я изменил размер изображения и теперь могу успешно обрезать изображение.Но изменение размера снижает качество изображения.Так что теперь я пытаюсь найти лучший метод.

Спасибо

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Вы ищете CIAffineTransform или CIPerspectiveCorrection .Я не уверен, что лучше для вашего случая использования, но они должны работать обаНапример, вы можете использовать CIPerspectiveCorrection следующим образом:

(CIImageToWorkWith).applyingFilter("CIPerspectiveCorrection", parameters: [
                            "inputTopLeft" : CIVector(cgPoint: topleft),
                            "inputTopRight" : CIVector(cgPoint: topright),
                            "inputBottomLeft" : CIVector(cgPoint: bottomleft),
                            "inputBottomRight" : CIVector(cgPoint: bottomright)
                            ])

edit: Вы не хотите обрезать изображение.Обрезка подобна вырезанию чего-либо из изображения без его масштабирования.

0 голосов
/ 19 сентября 2018

Я думаю, что самый простой способ добиться этого заключается в следующем:

extension UIImage {
    func crop(to rect: CGRect) -> UIImage? {
        guard let imageRef = cgImage, let cropped = imageRef.cropping(to: rect) else {
            return nil
        }
        return UIImage(cgImage: cropped)
    }
}
0 голосов
/ 19 сентября 2018

Вы можете обрезать изображение, используя этот код:

   - (UIImage *)imageByCroppingImage:(UIImage *)image toSize:(CGSize)size
{
    // not equivalent to image.size (which depends on the imageOrientation)!
    double refWidth = CGImageGetWidth(image.CGImage);
    double refHeight = CGImageGetHeight(image.CGImage);

    double x = (refWidth - size.width) / 2.0;
    double y = (refHeight - size.height) / 2.0;

    CGRect cropRect = CGRectMake(x, y, size.height, size.width);
    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);

    UIImage *cropped = [UIImage imageWithCGImage:imageRef scale:0.0 orientation:self.imageOrientation];
    CGImageRelease(imageRef);

    return cropped;
}

Передав свое изображение и прямоугольник вида, вы получите обрезанное изображение из центра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...