Сбой расширения общего доступа при попытке обрезать очень большое изображение - PullRequest
1 голос
/ 03 мая 2019

Я использую TOCropViewController для обрезки моего изображения.Это работает нормально в основном приложении.Проблема в том, что когда я пытаюсь использовать эту библиотеку в расширении общего доступа, она не работает.Не работая, я имею в виду, когда я пытаюсь обрезать очень большое изображение (изображение, снятое на камеру iPhone), расширение выходит из строя.По словам разработчика библиотеки, это может быть связано с проблемой памяти при попытке обрезки.Поэтому я попытался уменьшить изображение, прежде чем передавать его на изображение.Теперь проблема, с которой я сталкиваюсь, заключается в том, что это уменьшение масштаба работает для нескольких изображений и приводит к краху для других.Не уверен, почему это происходит.Код, который я использую для уменьшения масштаба:

- (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize isAspectRatio:(BOOL)aspect {
    if (!image) {
        return nil;
    }
    CGFloat originRatio = image.size.width / image.size.height;
    CGFloat newRatio = newSize.width / newSize.height;

    CGSize sz;

    if (!aspect) {
        sz = newSize;
    }else {
        if (originRatio < newRatio) {
            sz.height = newSize.height;
            sz.width = newSize.height * originRatio;
        }else {
            sz.width = newSize.width;
            sz.height = newSize.width / originRatio;
        }
    }
    CGFloat scale = 1.0;
    sz.width /= scale;
    sz.height /= scale;
    UIGraphicsBeginImageContextWithOptions(sz, NO, scale);
    [image drawInRect:CGRectMake(0, 0, sz.width, sz.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

Может кто-нибудь предложить способ уменьшения масштаба изображения в расширении общего ресурса, чтобы избежать сбоев?

Заранее спасибо.

1 Ответ

0 голосов
/ 08 мая 2019

Вы можете попробовать использовать рекомендацию Apple от WWDC2018 :

// Downsampling large images for display at smaller size 
func downsample(imageAt imageURL: URL, to pointSize: CGSize, scale: CGFloat) -> UIImage {  
     let imageSourceOptions = [kCGImageSourceShouldCache: false] as CFDictionary 

     let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL, imageSourceOptions)! 

     let maxDimensionInPixels = max(pointSize.width, pointSize.height) * scale  
     let downsampleOptions =  [kCGImageSourceCreateThumbnailFromImageAlways: true,
     kCGImageSourceShouldCacheImmediately: true, 
     kCGImageSourceCreateThumbnailWithTransform: true,
     kCGImageSourceThumbnailMaxPixelSize: maxDimensionInPixels] as CFDictionary   
     let downsampledImage =   CGImageSourceCreateThumbnailAtIndex(imageSource, 0, downsampleOptions)!  
     return UIImage(cgImage: downsampledImage) 
}
...