Базовый графический эффект: работает на симуляторе, но не на устройстве - PullRequest
0 голосов
/ 09 декабря 2011

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

1st image

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

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

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

2nd image

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

Затем метод создает простую маску, применяет тени и возможности и возвращает совершенно новый 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;

}

1 Ответ

1 голос
/ 10 декабря 2011

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

...