Создайте новый UIImage путем добавления тени к существующему UIImage

Я смотрел на этот вопрос: Проблема Тени UIImage

Но принятый ответ не работал на меня.

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

Это - то, что я пробую:

- (UIImage*)imageWithShadow {

    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef shadowContext = CGBitmapContextCreate(NULL, self.size.width, self.size.height + 1, CGImageGetBitsPerComponent(self.CGImage), 0, 
                                                 colourSpace, kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(colourSpace);

    CGContextSetShadow(shadowContext, CGSizeMake(0, -1), 1);
    CGContextDrawImage(shadowContext, CGRectMake(0, 0, self.size.width, self.size.height), self.CGImage);

    CGImageRef shadowedCGImage = CGBitmapContextCreateImage(shadowContext);
    CGContextRelease(shadowContext);

    UIImage * shadowedImage = [UIImage imageWithCGImage:shadowedCGImage];
    CGImageRelease(shadowedCGImage);

    return shadowedImage;
}

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

Я делаю это корректный путь или являюсь там чем-то очевидным, которое я пропускаю?

10
задан Community 23 May 2017 в 12:09
поделиться

1 ответ

В вашем коде есть несколько проблем:

  • Целевое изображение слишком маленькое. Убедитесь, что места для рисования тени достаточно.
  • Рассмотрите возможность использования CGContextSetShadowWithColor для определения тени и ее цвета.
  • Не забывайте, что система координат перевернута, поэтому начало координат находится внизу-слева, а не вверху-слева.

Исправив эти проблемы, тень должна быть нарисована.

- (UIImage*)imageWithShadow {
    CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef shadowContext = CGBitmapContextCreate(NULL, self.size.width + 10, self.size.height + 10, CGImageGetBitsPerComponent(self.CGImage), 0, 
                                             colourSpace, kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(colourSpace);

    CGContextSetShadowWithColor(shadowContext, CGSizeMake(5, -5), 5, [UIColor blackColor].CGColor);
    CGContextDrawImage(shadowContext, CGRectMake(0, 10, self.size.width, self.size.height), self.CGImage);

    CGImageRef shadowedCGImage = CGBitmapContextCreateImage(shadowContext);
    CGContextRelease(shadowContext);

    UIImage * shadowedImage = [UIImage imageWithCGImage:shadowedCGImage];
    CGImageRelease(shadowedCGImage);

    return shadowedImage;
}
17
ответ дан 3 December 2019 в 14:10
поделиться