Как я добавляю внешнее свечение к UIImage или UIImageView или UIView

Я хочу добавить УВЯДШЕЕ теневое/внешнее свечение к a UIImage/UIImageView/UIView но я знаю нет Core Graphics вообще.

Править: Помогите!!

9
задан Jab 23 February 2010 в 13:44
поделиться

2 ответа

(вряд ли обязательно знать, но все еще полезно) Написание доменных языков с операторской перегрузкой и метапрограммированием шаблонов (хороший пример см. в Boost.Spirit) - но это та вещь, которая делает съемку себя в ногу тоже легко.

-121--3153462-

Можно (de) сериализовать с помощью маринованных огурчиков . Он обратно совместим, т.е. будет поддерживать все старые протоколы в будущих версиях.

import pickle

som = SOM_CLASS()
fileObject = <any file-like object>
pickle.dump(som, fileObject)
#...
som = pickle.load(fileObject)
som.work()

Но имейте в виду, что если вы перенесете маринованные объекты на другой компьютер, убедитесь, что подключение не может быть подделано, так как маринованный огурчик может быть небезопасным (это статья, которую должен знать каждый пользователь маринованного огурчика).

Другой альтернативой является более старый модуль маршал .

-121--3090565-

Используйте подход, описанный Cirrostratus, сохраните кэшированную копию, а затем примените преобразование для изменения размера и/или положения изображения при перетаскивании.

(предупреждение, это не функциональный/проверенный код, но вы должны начать)

-(UIImage*)addGlowToImage:(UIImage*)imageInput;
{
    CGRect newSize = imageInput.bounds;
    CGImageRef theImage = imageInput.CGImage;

    // expand the size to handle the "glow"
    newSize.size.width += 6.0;
    newSize.size.height += 6.0;
    UIGraphicsBeginImageContext(newSize);
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGContextBeginTransparencyLayerWithRect(ctx, newSize, NULL);
    CGContextClearRect(ctx, newSize);

    // you can repeat this process to build glow.
    CGContextDrawImage(ctx, newSize, theImage); 
    CGContextSetAlpha(ctx, 0.2);  

    CGContextEndTransparencyLayer(ctx);

    // draw the original image into the context, offset to be centered;
    CGRect centerRect = inputImage.bounds;
    centerRect.origin.x += 3.0;
    centerRect.origin.y += 3.0;
    CGContextDrawImage(ctx, centerRect, theImage);

    result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return result;
}

Тогда в вашем методе при масштабировании вы бы сделали что-то вроде:

// assumes UIImage *cachedImage = [self addGlowToImage:origImage]; has been called already.
// assumes ivars for scale exists

    CGRect newRect = cachedImage.bounds;
    newRect.size.width += scale;
    newRect.size.height += scale;

    [cachedImage drawInRect:newRect];  // image will be scaled to fill destination rectangle.

Обязательно посмотрите на яблочные документы. Хорошим отправным пунктом является Quartz 2D Programming Guide .

8
ответ дан 4 December 2019 в 13:47
поделиться

Из соображений производительности iPhone OS не поддерживает свойства shadowColor, shadowOffset, shadowOpacity и shadowRadius, которые обычно можно использовать в Какао. Большинство людей дублируют форму, которую они хотят светить, несколько раз, каждый раз понижая непрозрачность и смещая форму на один пиксель за раз, чтобы имитировать вид свечения. Если ваше свечение не должно быть очень большим, вы не заметите разницы.

2
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: