গতিশীলভাবে আইফোনে একটি রঙিন 1x1 UII छवि কীভাবে তৈরি করবেন?


120

আমি ইউআইকোলারের উপর ভিত্তি করে গতিশীলভাবে 1x1 ইউআইআইমেজ তৈরি করতে চাই।

আমার সন্দেহ হয় এটি দ্রুত কোয়ার্টজ 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);
এইচপিফিক

দয়া করে
সুইফ্ট

পরিবর্তে সুইফটটিকে কাস্টম ইনিশিয়ালাইজার বানানোর কোনও উপায় আছে কি?
আন্তজি

1
কেন UIGraphicsGetCurrentContext()returnin nil? সম্পাদনা : আমি বুঝেছি, আমি ক্ষণস্থায়ী ছিল 0জন্য rectএর width
Iulian Onofrei

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

এটি একটি ইউআইআইমেজ বিভাগে রাখুন এবং উপসর্গটি পরিবর্তন করুন।


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

অ্যাপলের সর্বশেষ ইউআইজিগ্রাফিকস ইমেজ রেন্ডারার ব্যবহার কোডটি খুব ছোট:

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

আমার কাছে, একটি সুবিধাগুলি সুইফটে আরও কম অনুভূত হচ্ছে।

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 প্রস্থের প্রস্থের একটি স্ট্রোক কাজ করা উচিত। শুধু চারপাশে খেলা।

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