วิธีสร้าง UIImage 1x1 สีบน iPhone แบบไดนามิก


120

ฉันต้องการสร้าง 1x1 UIImage แบบไดนามิกโดยใช้ UIColor

ฉันสงสัยว่าสิ่งนี้สามารถทำได้อย่างรวดเร็วด้วย Quartz2d และฉันกำลังมองหาเอกสารที่พยายามทำความเข้าใจพื้นฐาน อย่างไรก็ตามดูเหมือนว่ามีข้อผิดพลาดที่อาจเกิดขึ้นมากมาย: ไม่ระบุจำนวนบิตและไบต์ต่อสิ่งต่าง ๆ อย่างถูกต้อง, ไม่ระบุแฟล็กที่ถูกต้อง, ไม่ปล่อยข้อมูลที่ไม่ได้ใช้ ฯลฯ

สิ่งนี้จะทำได้อย่างปลอดภัยด้วย Quartz 2d (หรือวิธีอื่นที่ง่ายกว่านั้น) ได้อย่างไร?

คำตอบ:


331

คุณสามารถใช้CGContextSetFillColorWithColorและCGContextFillRectสำหรับสิ่งนี้:

รวดเร็ว

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
นีซหนึ่ง :-) [UIImage imageWithColor: [UIColor redColor]]ฉันจะแนะนำการวางวิธีนี้ในหมวดหมู่เป็นวิธีการเรียนแล้วมันสามารถเพิ่มเข้าไปในโครงการเพียงและเรียกใช้สายเช่น

7
ในกรณีที่คุณสร้างภาพเหล่านี้แบบวนซ้ำหรือใช้ขนาดที่ใหญ่ขึ้นการเพิ่มประสิทธิภาพจะใช้ผ้าใบทึบแสงก็ต่อเมื่อสีมีอัลฟา แบบนี้:const CGFloat alpha = CGColorGetAlpha(color.CGColor); const BOOL opaque = alpha == 1; UIGraphicsBeginImageContextWithOptions(size, opaque, 0);
hpique

โปรดระบุรุ่นที่รวดเร็ว
fnc12

มีวิธีทำให้ swift เป็นตัวเริ่มต้นที่กำหนดเองแทนหรือไม่?
Antzi

1
ทำไมUIGraphicsGetCurrentContext()returnin nil? แก้ไข : ผมได้รับมันผมก็ผ่าน0สำหรับ'srect width
Iulian Onofrei

9

นี่เป็นอีกทางเลือกหนึ่งตามรหัสของ Matt Stephen สร้างภาพสีทึบที่ปรับขนาดได้เพื่อให้คุณสามารถนำมาใช้ซ้ำหรือเปลี่ยนขนาดได้ (เช่นใช้เป็นพื้นหลัง)

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

วางไว้ในหมวด UIImage และเปลี่ยนคำนำหน้า


6

ฉันใช้คำตอบของ Matt Steven หลายครั้งจึงสร้างหมวดหมู่ให้:

@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

5

การใช้ UIGraphicsImageRenderer ล่าสุดของ Apple รหัสนั้นค่อนข้างเล็ก:

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

สำหรับฉันการเริ่มต้นที่สะดวกสบายให้ความรู้สึกใกล้ชิดใน 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)
    }

}

-7

โอเคนี่จะไม่ใช่สิ่งที่คุณต้องการ แต่รหัสนี้จะลากเส้น คุณสามารถปรับให้เป็นประเด็นได้ หรืออย่างน้อยก็รับข้อมูลเล็กน้อยจากมัน

การทำให้ภาพ 1x1 ดูแปลก ๆ เล็กน้อย เส้นสโตรกลากเส้นดังนั้นความกว้าง 1.0 ที่ 0.5 ควรใช้งานได้ เพียงแค่เล่นไปรอบ ๆ

- (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();
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.