2011-01-11 3 views
4

Das ist wahrscheinlich sehr einfach, aber ich bin mir nicht einmal sicher, was es heißt - was das Googeln ein bisschen weniger nützlich als gewöhnlich macht.Farbe auf Graustufenbild anwenden, Alpha-Werte beibehalten (iOS/Quartz)

Ich habe eine Grauskala Strichzeichnung mit Alpha für Anti-Aliasing-Effekt. Diese Zeichnung wird als Spielertoken in einem Spiel verwendet. Zur Zeit habe ich ein paar kolorierte Varianten (in Photoshop) erstellt. Aber ich möchte in der Lage sein, das ursprüngliche Bild unter Beibehaltung der Alpha-Werte programmatisch einzufärben. Ich verwende Quartz/Core Graphics, und ich vermute, dass es eine Art Mischung gibt, die den gewünschten Effekt erzielen würde - aber nicht sicher, ob oder ob dies der richtige Ansatz ist.

+0

Haben Sie das jemals zur Arbeit gebracht? Wenn ja, würden Sie Ihre Lösung posten? (Ich habe heute eine ähnliche Frage gestellt: http://stackoverflow.com/questions/14176569/i-want-to-use-quartz-to-make-a-single-color-image-a-different-color) – livingtech

+0

@livingtech - Nein, habe ich nie gemacht. Aber ich würde gerne wissen, ob das möglich ist - mit angemessener Effizienz. – westsider

+0

Es ist definitiv möglich, und ich habe es in 'drawRect:' implementiert. Wenn Sie also nicht jeden Frame oder irgendwas ändern, werden Sie wahrscheinlich keine Effizienzprobleme haben. Sehen Sie den Link, den ich für meine Antwort gepostet habe (was etwas anders sein könnte als Sie gesucht haben). Eigentlich sollte ich hier einfach eine andere Antwort schreiben. – livingtech

Antwort

8

Versuchen Sie es.

ColorChangingImageView.h:

#import <UIKit/UIKit.h> 

@interface ColorChangingImageView : UIView 
@property (strong, nonatomic) UIImage *image; 
@property (strong, nonatomic) UIColor *colorToChangeInto; 
@end 

ColorChangingImageView.m:

#import "ColorChangingImageView.h" 

@implementation ColorChangingImageView 

@synthesize image = _image; 
@synthesize colorToChangeInto = _colorToChangeInto; 

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextScaleCTM(context, 1, -1); 
    CGContextTranslateCTM(context, 0, -rect.size.height); 

    CGImageRef maskImage = [self.image CGImage]; 
    CGContextClipToMask(context, rect, maskImage); 

    [_colorToChangeInto setFill]; 
    CGContextFillRect(context, rect); 

    //blend mode overlay 
    CGContextSetBlendMode(context, kCGBlendModeOverlay); 

    //draw the image 
    CGContextDrawImage(context, rect, _image.CGImage); 
} 

Dann, es zu benutzen:

ColorChangingImageView *iv = [[ColorChangingImageView alloc] initWithFrame:rect]; 
[iv setBackgroundColor:[UIColor clearColor]]; // might not need this, not sure. 
[iv setImage:[UIImage imageNamed:@"image.png"]]; 
[iv setColorToChangeInto:[UIColor blueColor]]; 

... oder wie auch immer, etwas sehr nah an th dabei. Lass es mich wissen, wenn es für dich klappt.

Sie können auch mit dem zweiten Parameter auf CGContextSetBlendMode() für etwas andere Effekte spielen.

+0

Danke. Es wird noch eine Weile dauern, bis ich das ausprobieren kann. Ich habe meinen Job gewechselt - und ich habe gerade nicht viel iOS-Programmierung gemacht ... leider. :-) – westsider

+0

Ahhh ... tut mir leid, es zu hören! Danke für die Verbesserung. :) – livingtech

+1

Es hat gut funktioniert für mich! Vielen Dank – htafoya

Verwandte Themen