Изрязаното изображение на 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