Как затемнить PNG? - PullRequest
3 голосов
/ 04 марта 2012

Могу указать, что рисование и рендеринг в Objective-C - моя слабость. Теперь вот моя проблема.

Я хочу добавить функцию «День / Ночь» в мою игру. У него есть много объектов на карте. Каждый объект представляет собой UIView, содержащий некоторые данные в переменных и некоторые UIImageViews: спрайт, а некоторые объекты имеют скрытое кольцо (используется для отображения выбора).

Я хочу иметь возможность затемнять содержимое UIView, но я не могу понять, как. Спрайт - это PNG с прозрачностью. Мне только что удалось добавить черный прямоугольник позади спрайта, используя это:

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);

CGContextSetRGBFillColor(ctx, 0, 0, 0, 0.5);
CGContextFillRect(ctx, rect);
CGContextRestoreGState(ctx);

Как я читал, это должно быть сделано в методе drawRect. Помогите пожалуйста!

Если вы хотите лучше понять мой сценарий, приложение, в котором я пытаюсь это сделать, называется «Кипос» в App Store.

Ответы [ 4 ]

2 голосов
/ 25 августа 2012

Подход Floris497 - это хорошая стратегия для затемнения общего слоя более чем для одного изображения за раз (вероятно, больше того, что вам нужно в этом случае).Но вот метод общего назначения для генерации более темных изображений UIImage (с учетом альфа-пикселей):

+ (UIImage *)darkenImage:(UIImage *)image toLevel:(CGFloat)level
{
    // Create a temporary view to act as a darkening layer
    CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    UIView *tempView = [[UIView alloc] initWithFrame:frame];
    tempView.backgroundColor = [UIColor blackColor];
    tempView.alpha = level;

    // Draw the image into a new graphics context
    UIGraphicsBeginImageContext(frame.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [image drawInRect:frame];

    // Flip the context vertically so we can draw the dark layer via a mask that
    // aligns with the image's alpha pixels (Quartz uses flipped coordinates)
    CGContextTranslateCTM(context, 0, frame.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextClipToMask(context, frame, image.CGImage);
    [tempView.layer renderInContext:context];

    // Produce a new image from this context
    CGImageRef imageRef = CGBitmapContextCreateImage(context);
    UIImage *toReturn = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    UIGraphicsEndImageContext();
    [tempView release];
    return toReturn;
}
1 голос
/ 04 марта 2012

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

CIFilter *filter = [CIFilter filterWithName:@"CIExposureAdjust"];
[filter setDefaults];
[filter setValue:[NSNumber numberWithFloat:-2.0] forKey:@"inputEV"];
view.layer.filters = [NSArray arrayWithObject:filter];
1 голос
/ 04 августа 2012

Вот как это сделать:

// inputEV controlls the exposure, the lower the darker (e.g "-1" -> dark) 
-(UIImage*)adjustImage:(UIImage*)image exposure:(float)inputEV
{
    CIImage *inputImage = [[CIImage alloc] initWithCGImage:[image CGImage]];
    UIImageOrientation originalOrientation = image.imageOrientation;

    CIFilter* adjustmentFilter = [CIFilter filterWithName:@"CIExposureAdjust"];
    [adjustmentFilter setDefaults];
    [adjustmentFilter setValue:inputImage forKey:@"inputImage"];
    [adjustmentFilter setValue:[NSNumber numberWithFloat:-1.0] forKey:@"inputEV"];

    CIImage *outputImage = [adjustmentFilter valueForKey:@"outputImage"];
    CIContext* context = [CIContext contextWithOptions:nil];
    CGImageRef imgRef = [context createCGImage:outputImage fromRect:outputImage.extent] ;

    UIImage* img = [[UIImage alloc] initWithCGImage:imgRef scale:1.0 orientation:originalOrientation];

    CGImageRelease(imgRef);

    return img;    
}

Не забудьте импортировать:

#import <QuartzCore/Quartzcore.h>

И добавьте CoreGraphics и CoreImage фреймворки в ваш проект. Протестировано на iPhone 3GS с iOS 5.1 CIFilter доступно начиная с iOS 5.0.

0 голосов
/ 04 марта 2012

нарисуйте UIView (черный) поверх него и установите для параметра «Взаимодействие с пользователем» значение NO

. Надеюсь, вы сможете что-то с этим сделать.1005 *

[UIView animateWithDuration:2
                      animations:^{nightView.alpha = 0.4;}
                          completion:^(BOOL finished){ NSLog(@"done making it dark"); ]; }];

чтобы было светло

[UIView animateWithDuration:2
                      animations:^{nightView.alpha = 0.0;}
                          completion:^(BOOL finished){ NSLog(@"done making it light again"); ]; }];
...