121 votes

Comment créer un UIImage 1x1 coloré sur l'iPhone de manière dynamique?

Je voudrais créer un UIImage 1x1 dynamiquement basé sur un UIColor.

Je soupçonne que cela peut être fait rapidement avec Quartz2d, ​​et je passe en revue la documentation en essayant de comprendre les fondamentaux. Cependant, il semble y avoir beaucoup de pièges potentiels: ne pas identifier correctement le nombre de bits et d'octets par élément, ne pas spécifier les bons indicateurs, ne pas diffuser les données inutilisées, etc.

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

332voto

Matt Stevens Points 6554

Vous pouvez utiliser CGContextSetFillColorWithColor et CGContextFillRect pour cela:

 + (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;
}
 

9voto

Ben Lachman Points 1206

Voici une autre option basée sur le code de Matt Stephen. Il crée une image couleur solide redimensionnable de sorte que vous puissiez la réutiliser ou modifier sa taille (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;
}
 

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

6voto

mxcl Points 5921

J'ai utilisé la réponse de Matt Steven à plusieurs reprises.

 @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
 

-7voto

Corey Floyd Points 16747

Ok, ce ne sera pas exactement ce que vous voulez, mais ce code trace une ligne. Vous pouvez l'adapter pour faire un point. Ou du moins obtenir un peu d'informations de sa part.

Rendre l'image 1x1 semble un peu bizarre. Les traits parcourent la ligne, donc un trait de largeur 1,0 à 0,5 devrait fonctionner. Jouez simplement.

 - (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();
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X