Эффект Core Graphics: работает на симуляторе, но не на устройстве

Я сделал простой, но эффективный эффект тиснения с помощью Core Graphics. Это прекрасно работает! Но только в симуляторе... Вот результат:

1-е изображение

Я делаю следующее: - Из выбранного изображения я убираю альфу, если она есть, и заливаю ее белым цветом. - я преобразовываю это изображение RGB в оттенки серого - я инвертирую цвета этого изображения

Затем я вызываю пользовательский метод для создания эффекта с параметрами:

  • canvasImg: полупрозрачное изображение для маскирования.
  • maskImg: изображение, которое я только что создал, в оттенках серого и инвертированное:

2-е изображение

  • opacity: непрозрачность результирующего изображения

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

Вот код:

- (UIImage *)stampImage:(UIImage *)canvasImg withMask:(UIImage *)maskImg withOpacity:(CGFloat)opacity
{
//Creating the mask Image
CGContextRef mainViewContentContext;
CGColorSpaceRef colorSpace;
colorSpace = CGColorSpaceCreateDeviceRGB();
mainViewContentContext = CGBitmapContextCreate(NULL, maskImg.size.width, maskImg.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);

if (mainViewContentContext == NULL) return NULL;

CGContextClipToMask(mainViewContentContext, CGRectMake(0, 0, maskImg.size.width, maskImg.size.height), maskImg.CGImage);
CGContextDrawImage(mainViewContentContext, CGRectMake(0, 0, maskImg.size.width, maskImg.size.height), canvasImg.CGImage);
CGContextSetAllowsAntialiasing(mainViewContentContext, true);
CGContextSetShouldAntialias(mainViewContentContext, true);
CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(mainViewContentContext);
CGContextRelease(mainViewContentContext);
UIImage *maskedImage = [UIImage imageWithCGImage:mainViewContentBitmapContext];
CGImageRelease(mainViewContentBitmapContext);

//Giving some Drop shadows
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef shadowContext = CGBitmapContextCreate(NULL, maskedImage.size.width + 10, maskedImage.size.height + 10,
                                                   CGImageGetBitsPerComponent(maskedImage.CGImage), 0, 
                                                   colourSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colourSpace);
CGContextSetShadowWithColor(shadowContext, CGSizeMake(0, -1), 1, [UIColor colorWithWhite:1.0 alpha:0.3].CGColor);
CGContextSetAllowsAntialiasing(shadowContext, true);
CGContextSetShouldAntialias(shadowContext, true);
CGContextDrawImage(shadowContext, CGRectMake(0, 10, maskedImage.size.width, maskedImage.size.height), maskedImage.CGImage);
CGImageRef shadowedCGImage = CGBitmapContextCreateImage(shadowContext);
CGContextRelease(shadowContext);

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

return stampImg;

}


person DZenBot    schedule 09.12.2011    source источник
comment
Какой результат вы видите на устройстве?   -  person Lily Ballard    schedule 09.12.2011
comment
Если вы просто возвращаете nil, проверили ли вы, что mainViewContentContext не является NULL? Возможно, разрешенные входные данные для CGBitmapContextCreate() на рабочем столе и на устройстве различаются.   -  person Lily Ballard    schedule 09.12.2011
comment
Спасибо, Кевин. Я не думаю о CGBitmapContextCreate(), это может быть проблемой. Я посмотрю на это.   -  person DZenBot    schedule 10.12.2011
comment
В устройстве я получил пустой UIImage, но это не ноль.   -  person DZenBot    schedule 10.12.2011
comment
Может быть shadowContext? Вы не тестируете на NULL там.   -  person Lily Ballard    schedule 10.12.2011


Ответы (1)


Также помните об ограничениях памяти устройства по сравнению с симулятором. У меня была компьютерная логика, которая отлично строилась и работала на симуляторе; та же логика будет построена и запущена, не выдавая ошибок на устройстве, но визуальный результат не будет желаемым. Я бы предложил попробовать вашу логику на значительно меньшем изображении, чтобы убедиться, что она работает на устройстве. Мне пришлось отказаться от некоторых очень крутых вещей для маскирования изображений, которые я придумал, потому что у устройства не было достаточной мощности, чтобы справиться с большими изображениями.

person jstevenco    schedule 09.12.2011
comment
Бинго! Впервые это был не код, а изображение холста. Поэтому я просто сделал новое изображение, полупрозрачное, в оттенках серого, и все заработало на устройстве! Спасибо, Кевин и jstevenco за ваши ответы: P - person DZenBot; 10.12.2011