<Error>: CGBitmapContextCreate: неподдерживаемая комбинация параметров и изображение с более низким разрешением - PullRequest
1 голос
/ 01 марта 2012
- (UIImage *)roundedCornerImage:(NSInteger)cornerSize borderSize:(NSInteger)borderSize {
    // If the image does not have an alpha layer, add one
    UIImage *image = [self imageWithAlpha];

    // Build a context that's the same dimensions as the new size
    CGBitmapInfo info = CGImageGetBitmapInfo(image.CGImage);
    CGContextRef context = CGBitmapContextCreate(NULL,
                                             image.size.width,
                                             image.size.height,
                                             CGImageGetBitsPerComponent(image.CGImage),
                                             0,
                                             CGImageGetColorSpace(image.CGImage),
                                             CGImageGetBitmapInfo(image.CGImage));

    // Create a clipping path with rounded corners
    CGContextBeginPath(context);
    [self addRoundedRectToPath:CGRectMake(borderSize, borderSize, image.size.width - borderSize * 2, image.size.height - borderSize * 2)
                   context:context
                 ovalWidth:cornerSize
                ovalHeight:cornerSize];
    CGContextClosePath(context);
    CGContextClip(context);

    // Draw the image to the context; the clipping path will make anything outside the rounded rect transparent
    CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);

    // Create a CGImage from the context
    CGImageRef clippedImage = CGBitmapContextCreateImage(context);
    CGContextRelease(context);

    // Create a UIImage from the CGImage
    UIImage *roundedImage = [UIImage imageWithCGImage:clippedImage];
    CGImageRelease(clippedImage);

    return roundedImage;
}

У меня есть метод, описанный выше, и я добавляю скругленные углы к изображениям профиля в Twitter. Для большинства изображений это работает потрясающе. Некоторые из них вызывают следующую ошибку:

: CGBitmapContextCreate: неподдерживаемая комбинация параметров: 8 целых бит / компонент; 32 бит / пиксель; 3-х компонентное цветовое пространство; kCGImageAlphaLast; 96 байт / строка.

Я провел некоторую отладку, и похоже, что единственное отличие от изображений, вызывающих ошибки, и тех, которые не являются, - это параметр CGImageGetBitmapInfo (image.CGImage) при создании контекста. Это выдает ошибку и приводит к тому, что контекст становится нулевым. Я попытался установить последний параметр kCGImageAlphaPremultipliedLast, но безрезультатно. На этот раз изображение нарисовано, но с гораздо меньшим качеством. Есть ли способ получить более качественное изображение наравне с остальными? Путь к изображению через Твиттер, поэтому не уверен, что они могут быть разными.

Я видел и другие вопросы, касающиеся этой ошибки. Никто из них не решил эту проблему. Я видел этот пост , но изображения с ошибками после этого полностью расплывчаты. И приведение ширины и высоты к NSInteger также не сработало. Ниже приведен скриншот двух изображений профиля и их качества. Первый вызывает ошибку.

Here is a screenshot of the two images and their quality

Кто-нибудь знает, в чем здесь проблема?

Спасибо за тонну. Это убивает меня.

1 Ответ

4 голосов
/ 01 марта 2012

iOS не поддерживает kCGImageAlphaLast.Вам нужно использовать kCGImageAlphaPremultipliedLast.

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

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

- (UIImage *)roundedCornerImage:(NSInteger)cornerSize borderSize:(NSInteger)borderSize {
    // If the image does not have an alpha layer, add one
    UIImage *image = [self imageWithAlpha];

    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); {
        CGRect imageRect = (CGRect){ CGPointZero, image.size };
        CGRect borderRect = CGRectInset(imageRect, borderSize, borderSize);
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:borderRect
            byRoundingCorners:UIRectCornerAllCorners
            cornerRadii:CGSizeMake(cornerSize, cornerSize)];
        [path addClip];
        [image drawAtPoint:CGPointZero];
    }
    UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return roundedImage;
}

Если ваш метод imageWithAlpha сам создает UIImage из другого UIImage, ему необходимораспространять шкалу также.

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