2009-06-13 6 views
110

Je voudrais créer un UIImage 1x1 dynamiquement basé sur un UIColor.Comment créer dynamiquement un UIImage 1x1 coloré sur l'iPhone?

Je suppose que cela peut être fait rapidement avec Quartz2d, ​​et je suis en train de parcourir la documentation pour essayer de comprendre les principes fondamentaux. Cependant, il semble qu'il y ait beaucoup d'embûches potentielles: ne pas identifier correctement les nombres de bits et d'octets, ne pas spécifier les bons indicateurs, ne pas libérer de données inutilisées, etc.

Comment cela peut-il être fait en toute sécurité avec Quartz? 2d (ou un autre moyen plus simple)?

Répondre

318

Vous pouvez utiliser CGContextSetFillColorWithColor et CGContextFillRect pour cela:

Swift

extension UIImage { 
    class func image(with color: UIColor) -> UIImage { 
     let rect = CGRectMake(0.0, 0.0, 1.0, 1.0) 
     UIGraphicsBeginImageContext(rect.size) 
     let context = UIGraphicsGetCurrentContext() 

     CGContextSetFillColorWithColor(context, color.CGColor) 
     CGContextFillRect(context, rect) 

     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return image 
    } 
} 

swift3

extension UIImage { 
    class func image(with color: UIColor) -> UIImage { 
     let rect = CGRect(origin: CGPoint(x: 0, y:0), size: CGSize(width: 1, height: 1)) 
     UIGraphicsBeginImageContext(rect.size) 
     let context = UIGraphicsGetCurrentContext()! 

     context.setFillColor(color.cgColor) 
     context.fill(rect) 

     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return image! 
    } 
} 

Objective-C

+ (UIImage *)imageWithColor:(UIColor *)color { 
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); 
    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetFillColorWithColor(context, [color CGColor]); 
    CGContextFillRect(context, rect); 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 
+19

Nice :-) Je recommanderais de mettre cette méthode dans une catégorie en tant que méthode de classe, puis de l'ajouter simplement dans un projet et de l'appeler en utilisant une ligne comme [UIImage imageWithColor: [UIColor redColor]] '. –

+7

Dans le cas où vous créez ces images dans une boucle ou en utilisant une taille plus grande, une optimisation serait d'utiliser une toile opaque seulement si la couleur a alpha. Comme ceci: 'const CGFloat alpha = CGColorGetAlpha (color.CGColor); const BOOL opaque = alpha == 1; UIGraphicsBeginImageContextWithOptions (size, opaque, 0); ' – hpique

+0

veuillez fournir la version rapide – fnc12

-6

Ok, ce ne sera pas exactement ce que vous voulez, mais ce code va dessiner une ligne. Vous pouvez l'adapter pour faire un point. Ou au moins obtenir un peu d'informations à partir de celui-ci. Faire l'image 1x1 semble un peu bizarre. Les traits roulent sur la ligne, donc un coup de largeur 1.0 à 0.5 devrait fonctionner. Juste jouer.

- (void)drawLine{ 

UIGraphicsBeginImageContext(CGSizeMake(320,300)); 

CGContextRef ctx = UIGraphicsGetCurrentContext(); 

float x = 0; 
float xEnd = 320; 
float y = 300; 

CGContextClearRect(ctx, CGRectMake(5, 45, 320, 300)); 

CGContextSetGrayStrokeColor(ctx, 1.0, 1.0); 

CGContextSetLineWidth(ctx, 1); 
CGPoint line[2] = { CGPointMake(x,y), CGPointMake(xEnd, y) }; 

CGContextStrokeLineSegments(ctx, line, 2); 

UIImage *theImage=UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 
6

J'ai utilisé réponse à plusieurs reprises de Matt Steven ainsi fait une catégorie pour elle:

@interface UIImage (mxcl) 
+ (UIImage *)squareImageWithColor:(UIColor *)color dimension:(int)dimension; 
@end 

@implementation UIImage (mxcl) 
+ (UIImage *)squareImageWithColor:(UIColor *)color dimension:(int)dimension { 
    CGRect rect = CGRectMake(0, 0, dimension, dimension); 
    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetFillColorWithColor(context, [color CGColor]); 
    CGContextFillRect(context, rect); 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 
@end 
7

Voici une autre option basée sur le code de Matt Stephen. Il crée une image en couleur solide redimensionnable de sorte que vous puissiez la réutiliser ou la modifier (par exemple, l'utiliser pour un arrière-plan).

+ (UIImage *)prefix_resizeableImageWithColor:(UIColor *)color { 
    CGRect rect = CGRectMake(0.0f, 0.0f, 3.0f, 3.0f); 
    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetFillColorWithColor(context, [color CGColor]); 
    CGContextFillRect(context, rect); 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)]; 

    return image; 
} 

Mettez-le dans une catégorie UIImage et modifiez le préfixe.

Questions connexes