Обрезанное изображение CGRect показывает неправильное значение

Когда я пытаюсь обрезать нижнюю часть изображения, результат увеличивается слева вверху. Без кропа изображение показывает нормально. Я действительно не понимаю, что я делаю не так с функцией кадрирования. Почему это не возвращает полное изображение с кадрированием? См. код и результаты ниже:

- (UIImage *)croppedImageFromScreenShot
{
    // Prepare view for screen capture

    // Screen Capture

    CGRect fullScreenRect = self.view.bounds;

    UIGraphicsBeginImageContextWithOptions(fullScreenRect.size, NO, [UIScreen mainScreen].scale);

    [self.view drawViewHierarchyInRect:fullScreenRect afterScreenUpdates:YES];

    UIImage *screenShotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Crop Image

    CGFloat cropDistance = 20.0;

    CGSize imageSize = screenShotImage.size;

    CGRect imageRect = CGRectMake(0.0, 0.0, imageSize.width, imageSize.height);

    CGRect cropRect = CGRectInset(imageRect, 0.0, cropDistance);

    CGImageRef imageRef = CGImageCreateWithImageInRect([screenShotImage CGImage], cropRect);

    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];

    CGImageRelease(imageRef);

    // Restore view after screen capture


    return croppedImage;
}

Обрезка идет хорошо, но изображение увеличено и уменьшено:

введите здесь описание изображения

Без обрезки размер просто прекрасен из кода ниже:

- (UIImage *)croppedImageFromScreenShot
{
    // Prepare view for screen capture

    // Screen Capture

    CGRect fullScreenRect = self.view.bounds;

    UIGraphicsBeginImageContextWithOptions(fullScreenRect.size, NO, [UIScreen mainScreen].scale);

    [self.view drawViewHierarchyInRect:fullScreenRect afterScreenUpdates:YES];

    UIImage *screenShotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


    return screenShotImage;
}

Возвращает к исходному изображению, как это и должно делать с обрезанной функцией:

введите здесь описание изображения


person Jan    schedule 06.06.2014    source источник


Ответы (2)


Измените это:

CGRect cropRect = CGRectInset(imageRect, 0.0, cropDistance);

В:

CGRect cropRect = CGRectMake(0,0,imageSize.width, imageSize.height - cropDistance);

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

person Cooper Buckingham    schedule 07.06.2014

Вы имеете дело с масштабированным изображением на дисплее сетчатки, но используете координаты экрана для конечного размера изображения (не сетчатки). Таким образом, вы получите верхний левый угол за вычетом рамки, которую вы удалили с помощью встроенной рамки. Умножьте imageSize.width и imageSize.height на [UIScreen mainScreen].scale, и вы, вероятно, получите то, что хотели изначально.

CGSize imageSize = screenShotImage.size;
imageSize.width *= [UIScreen mainScreen].scale;
imageSize.height *= [UIScreen mainScreen].scale;

Чтобы удалить только нижнюю часть изображения, попробуйте это вместо CGRectInset:

CGRect cropRect = imageRect;
cropRect.size.height -= cropDistance;
person escrafford    schedule 06.06.2014
comment
Привет, спасибо за ваш ответ, где я должен поместить это в код? У вас есть пример? Спасибо! - person Jan; 06.06.2014
comment
Это работает, спасибо! Единственная проблема сейчас в том, что он также обрезал верх. Есть ли способ, чтобы он обрезал только низ? - person Jan; 06.06.2014
comment
Возможно, CGRectInset - это не то, что вам нужно было тогда - это уменьшит каждую сторону на величину вставки. Если вы просто хотите удалить низ, вычтите количество из высоты. - person escrafford; 07.06.2014