गतिशील रूप से iPhone पर रंगीन 1x1 UIImage कैसे बनाएं?


120

मैं गतिशील रूप से UIColor पर आधारित 1x1 UIImage बनाना चाहूंगा।

मुझे संदेह है कि यह क्वार्ट्ज 2 डी के साथ जल्दी से किया जा सकता है, और मैं बुनियादी बातों की समझ हासिल करने की कोशिश कर रहा हूं। हालांकि, ऐसा लगता है कि बहुत अधिक संभावित नुकसान हैं: बिट्स और बाइट्स की संख्या को सही तरीके से पहचानना, सही झंडे को निर्दिष्ट नहीं करना, अप्रयुक्त डेटा को जारी नहीं करना, आदि।

यह क्वार्ट्ज 2 डी (या एक और सरल तरीका) के साथ सुरक्षित रूप से कैसे किया जा सकता है?

जवाबों:


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!
    }
}

उद्देश्य सी

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

क्या इसके बजाय स्विफ्ट को कस्टम इनिशियलाइज़र बनाने का एक तरीका है?
अंजी

1
क्यों UIGraphicsGetCurrentContext()लौट रहा है nil? संपादित करें : मैं समझ गया, मैं गुजर रहा था 0के लिए rectहै width
इउलियन ओनोफ्रेई

9

यहां मैट स्टीफन के कोड के आधार पर एक और विकल्प दिया गया है। यह एक ठोस ठोस रंग छवि बनाता है जैसे कि आप इसे पुन: उपयोग कर सकते हैं या इसे बदल सकते हैं (जैसे पृष्ठभूमि के लिए इसका उपयोग करें)।

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

मैंने कई बार मैट स्टीवन के जवाब का उपयोग किया ताकि इसके लिए एक श्रेणी बनाई जाए:

@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

Apple के नवीनतम UIGraphicsImageRenderer का उपयोग करना कोड बहुत छोटा है:

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

मेरे लिए, एक सुविधा init स्विफ्ट में खाने का अनुभव करता है।

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 बनाना थोड़ा अजीब लगता है। स्ट्रोक लाइन की सवारी करते हैं, इसलिए 0.5 पर चौड़ाई 1.0 का एक स्ट्रोक काम करना चाहिए। बस चारों ओर खेलते हैं।

- (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();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.