2009-06-13 11 views
110

Vorrei creare una matrice U1 1x1 in modo dinamico sulla base di un colore UIC.Come creare dinamicamente una UIImage 1x1 colorata su iPhone?

Sospetto che questo possa essere fatto rapidamente con Quartz2d, ​​e sto studiando la documentazione cercando di capire i fondamenti. Tuttavia, sembra che ci siano molte potenziali insidie: non identificare correttamente il numero di bit e byte per ogni cosa, non specificare i giusti flag, non rilasciare dati inutilizzati, ecc.

Come può essere fatto in modo sicuro con Quartz 2d (o un altro modo più semplice)?

risposta

318

È possibile utilizzare CGContextSetFillColorWithColor e CGContextFillRect per questo:

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

Bello :-) Suggerirei di inserire questo metodo in una categoria come metodo di classe, quindi può essere aggiunto semplicemente a un progetto e richiamato utilizzando una riga come '[UIImage imageWithColor: [UIColor redColor]]'. –

+7

Nel caso in cui si stiano creando queste immagini in un loop o utilizzando una dimensione maggiore, un'ottimizzazione consiste nell'utilizzare una tela opaca solo se il colore è alfa. Così: 'const CGFloat alpha = CGColorGetAlpha (color.CGColor); const BOOL opaque = alpha == 1; UIGraphicsBeginImageContextWithOptions (size, opaque, 0); ' – hpique

+0

si prega di fornire la versione rapida – fnc12

-6

Ok, questo non sarà esattamente quello che vuoi, ma questo codice disegnerà una linea. Puoi adattarlo per fare un punto. O almeno ottenere un po 'di informazioni da esso.

Fare l'immagine 1x1 sembra un po 'strano. Gli stroke vanno in linea, quindi dovrebbe funzionare un tratto di larghezza 1.0 a 0.5. Basta giocare.

- (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

ho usato molte volte risposta di Matt Steven così fatto una categoria per esso:

@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

Ecco un'altra opzione basata sul codice di Matt Stefano. Crea un'immagine a tinta unita ridimensionabile in modo tale da poterla riutilizzare o modificarne le dimensioni (ad esempio, utilizzarla per uno sfondo).

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

Inserirlo in una categoria UIImage e modificare il prefisso.

Problemi correlati