How to create a colored 1x1 UIImage on the iPhone dynamically?

后端 未结 6 2010
情书的邮戳
情书的邮戳 2020-11-28 01:53

I would like to create a 1x1 UIImage dynamically based on a UIColor.

I suspect this can quickly be done with Quartz2d, and I\'m poring over the documentation trying

相关标签:
6条回答
  • 2020-11-28 02:17

    I used Matt Steven's answer many times so made a category for it:

    @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
    
    0 讨论(0)
  • 2020-11-28 02:19

    Here's another option based on Matt Stephen's code. It creates a resizable solid color image such that you could reuse it or change it's size (e.g. use it for a background).

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

    Put it in a UIImage category and change the prefix.

    0 讨论(0)
  • 2020-11-28 02:19

    Using Apple's latest UIGraphicsImageRenderer the code is pretty small:

    import UIKit
    
    extension UIImage {
        static func from(color: UIColor) -> UIImage {
            let size = CGSize(width: 1, height: 1)
            return UIGraphicsImageRenderer(size: size).image(actions: { (context) in
                context.cgContext.setFillColor(color.cgColor)
                context.fill(.init(origin: .zero, size: size))
            })
        }
    }
    
    0 讨论(0)
  • 2020-11-28 02:19

    To me, a convenience init feels neater in Swift.

    extension UIImage {
    
        convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
    
            let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
            UIGraphicsBeginImageContext(rect.size)
            guard let context = UIGraphicsGetCurrentContext() else {
                return nil
            }
    
            context.setFillColor(color.cgColor)
            context.fill(rect)
    
            guard let image = context.makeImage() else {
                return nil
            }
            UIGraphicsEndImageContext()
    
            self.init(cgImage: image)
        }
    
    }
    
    0 讨论(0)
  • 2020-11-28 02:23

    Ok, this won't be exactly what you want, but this code will draw a line. You can adapt it to make a point. Or at least get a little info from it.

    Making the image 1x1 seems a little weird. Strokes ride the line, so a stroke of width 1.0 at 0.5 should work. Just play around.

    - (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();
    }
    
    0 讨论(0)
  • 2020-11-28 02:35

    You can use CGContextSetFillColorWithColor and CGContextFillRect for this:

    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;
    }
    
    0 讨论(0)
提交回复
热议问题