ইউআইআইমেজ রঙ পরিবর্তন করা হচ্ছে


101

আমি ইউআইআইমেজের রঙ পরিবর্তন করার চেষ্টা করছি। আমার কোড:

-(UIImage *)coloredImage:(UIImage *)firstImage withColor:(UIColor *)color {
    UIGraphicsBeginImageContext(firstImage.size);

    CGContextRef context = UIGraphicsGetCurrentContext();
    [color setFill];

    CGContextTranslateCTM(context, 0, firstImage.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextSetBlendMode(context, kCGBlendModeCopy);
    CGRect rect = CGRectMake(0, 0, firstImage.size.width, firstImage.size.height);
    CGContextDrawImage(context, rect, firstImage.CGImage);

    CGContextClipToMask(context, rect, firstImage.CGImage);
    CGContextAddRect(context, rect);
    CGContextDrawPath(context,kCGPathElementMoveToPoint);

    UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return coloredImg;
}

এই কোডটি কাজ করে, তবে প্রাপ্ত চিত্রটি তেমন উত্তম নয় returned আমি কীভাবে এই সমস্যার সমাধান করতে পারি?


উত্তর:


267

আইওএস 7 যেহেতু, এটি করার সবচেয়ে সহজ উপায় এটি।

উদ্দেশ্য গ:

theImageView.image = [theImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[theImageView setTintColor:[UIColor redColor]];

সুইফট ২.০:

theImageView.image = theImageView.image?.imageWithRenderingMode(.AlwaysTemplate) 
theImageView.tintColor = UIColor.magentaColor()

সুইফট 4.0:

theImageView.image = theImageView.image?.withRenderingMode(.alwaysTemplate) 
theImageView.tintColor = .magenta

স্টোরিবোর্ড:

আপনার সম্পদে প্রথমে চিত্রটি টেমপ্লেট হিসাবে (ডান বারে - রেন্ডার করুন) কনফিগার করুন। তারপরে ছবির রঙটি হ'ল রঙিন রঙ লাগানো হবে। এখানে চিত্র বর্ণনা লিখুন


"ইউআইজিএইচ রেন্ডারিংমডএলওয়েজ টেম্পলেট: চিত্রটিকে রঙের তথ্য উপেক্ষা করে সর্বদা টেম্পলেট চিত্র হিসাবে আঁকুন" " সুন্দর!
টাইম

4
সুইফ্ট ২.০++theImageView.image? = (theImageView.image?.imageWithRenderingMode(.AlwaysTemplate))! theImageView.tintColor = UIColor.magentaColor()
কলসাল

@ আনকিশজাইন এই পদ্ধতির আশেপাশে কোনও কার্যকারিতা সংক্রান্ত উদ্বেগ রয়েছে?
রোমহায়ার

4
এটি চিত্রের রঙ পরিবর্তন করে না, বরং দৃশকে এটি একটি ভিন্ন রঙের (রঙ) দিয়ে উপস্থাপনের নির্দেশ দেয়।
স্টিভ কুও

পছন্দ করুন আপনি সত্যই যে কোনও ইউআইআইমেজের জন্য এটি ব্যবহার করতে পারেন। img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [button setTintColor:[UIColor redColor]]; [button setImage:img forState:UIControlStateNormal];কৃতজ্ঞতা!
মোতাসিম

31

এটি উপরের উত্তরটি বেশ সুন্দর, তবে কিছুটা ছোট করা। এটি কেবলমাত্র একটি মুখোশ হিসাবে চিত্রটি নেয় এবং চিত্রটিকে "গুণ" বা রঙিন করে না।

উদ্দেশ্য গ:

    UIColor *color = <# UIColor #>;
    UIImage *image = <# UIImage #>;// Image to mask with
    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [color setFill];
    CGContextTranslateCTM(context, 0, image.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextClipToMask(context, CGRectMake(0, 0, image.size.width, image.size.height), [image CGImage]);
    CGContextFillRect(context, CGRectMake(0, 0, image.size.width, image.size.height));

    UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

দ্রুত:

    let color: UIColor = <# UIColor #>
    let image: UIImage = <# UIImage #> // Image to mask with
    UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale)
    let context = UIGraphicsGetCurrentContext()
    color.setFill()
    context?.translateBy(x: 0, y: image.size.height)
    context?.scaleBy(x: 1.0, y: -1.0)
    context?.clip(to: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height), mask: image.cgImage!)
    context?.fill(CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
    let coloredImg = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

4
UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);আপনার ব্যবহার করা উচিত কারণ আপনার সংস্করণটি কেবল নন রেটিনা গ্রাফিক্স তৈরি করবে।
নিকোলা লেজিক

ব্যবহারকারী 1270061 আমার অভিজ্ঞতাতে এটি করার উপায়। "জ্বলন্ত" সহ অন্য উত্তরের জন্য স্পষ্টতই নির্দিষ্ট রঙের উত্স চিত্রের প্রয়োজন। এইটি কেবল উত্স পিক্সেলের আলফা মানগুলি ব্যবহার করে এবং এটি পছন্দসই রঙের সাথে একত্রিত করে - নিখুঁত।
জেসন

নিখুঁত - কেবল উত্তরটি আমার পক্ষে ভাল কাজ করেছে। (মে 16 ')
ট্রাডাভিডসন

10

কোনও চিত্রকে আঁচড়ানোর আরও একটি উপায় হ'ল ধ্রুব রঙ দ্বারা কেবল এটি গুণ করা। কখনও কখনও, এটি অগ্রাধিকারযোগ্য কারণ এটি কালো অঞ্চলে রঙের মানগুলিকে "উত্তোলন" করে না; এটি চিত্রে আপেক্ষিক তীব্রতা একই রাখে। একটি রঙ হিসাবে একটি ওভারলে ব্যবহার করা বৈসাদৃশ্য সমতল করতে ঝোঁক।

এই কোডটি আমি ব্যবহার করি:

UIImage *MultiplyImageByConstantColor( UIImage *image, UIColor *color ) {

    CGSize backgroundSize = image.size;
    UIGraphicsBeginImageContext(backgroundSize);

    CGContextRef ctx = UIGraphicsGetCurrentContext();

    CGRect backgroundRect;
    backgroundRect.size = backgroundSize;
    backgroundRect.origin.x = 0;
    backgroundRect.origin.y = 0;

    CGFloat r,g,b,a;
    [color getRed:&r green:&g blue:&b alpha:&a];
    CGContextSetRGBFillColor(ctx, r, g, b, a);
    CGContextFillRect(ctx, backgroundRect);

    CGRect imageRect;
    imageRect.size = image.size;
    imageRect.origin.x = (backgroundSize.width - image.size.width)/2;
    imageRect.origin.y = (backgroundSize.height - image.size.height)/2;

    // Unflip the image
    CGContextTranslateCTM(ctx, 0, backgroundSize.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);

    CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
    CGContextDrawImage(ctx, imageRect, image.CGImage);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return newImage;
}

সুইফ্ট সংস্করণ

extension UIImage{

    static func multiplyImageByConstantColor(image:UIImage,color:UIColor)->UIImage{
        let backgroundSize = image.size
        UIGraphicsBeginImageContext(backgroundSize)

        let ctx = UIGraphicsGetCurrentContext()

        var backgroundRect=CGRect()
        backgroundRect.size = backgroundSize
        backgroundRect.origin.x = 0
        backgroundRect.origin.y = 0

        var r:CGFloat
        var g:CGFloat
        var b:CGFloat
        var a:CGFloat
        color.getRed(&r, green: &g, blue: &b, alpha: &a)
        CGContextSetRGBFillColor(ctx, r, g, b, a)
        CGContextFillRect(ctx, backgroundRect)

        var imageRect=CGRect()
        imageRect.size = image.size
        imageRect.origin.x = (backgroundSize.width - image.size.width)/2
        imageRect.origin.y = (backgroundSize.height - image.size.height)/2

        // Unflip the image
        CGContextTranslateCTM(ctx, 0, backgroundSize.height)
        CGContextScaleCTM(ctx, 1.0, -1.0)

        CGContextSetBlendMode(ctx, .Multiply)
        CGContextDrawImage(ctx, imageRect, image.CGImage)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }
}

ঠিক আমি সমাধান খুঁজছিলাম! ধন্যবাদ!
ভাইরাস আমাদের

আমি যদি ভার্চুয়াল ওয়াল পেইন্টিং অ্যাপ তৈরি করতে চাই তবে কী হবে? এটি কাজ করে, যদি কেবল ছবিতে দেয়াল রঙ করতে চান। দয়া করে এই লিঙ্কটি একবার দেখুন: - স্ট্যাকওভারফ্লো.com
শৈলেশ

এটি অন্যান্য সমাধানগুলির চেয়ে অনেক ভাল কাজ করে।
ম্যাট হাডসন

4
এটি কেবলমাত্র আমার জন্য অবজেক্টের পটভূমিতে রঙিত, এটি নিজেই না।
ব্যবহারকারী 3562927

7

সুইফট ৩.০ এ

imageView.image? = (imageView.image?.withRenderingMode(.alwaysTemplate))!
imageView.tintColor = UIColor.magenta

সুইফটে ২.০

yourImage.image? = (yourImage.image?.imageWithRenderingMode(.AlwaysTemplate))!
yourImage.tintColor = UIColor.magentaColor()

আপনি সুইফট অগ্রগামীদের উপভোগ করুন


4
কোড ঠিক আছে, তবে পোস্টটি ইউআইআইমেজ সম্পর্কিত। আমরা সবসময় ইউআইআইমেজভিউগুলির সাথে ডিল করি না।
হেনরি রুট টু

7

আইওএস 10 থেকে শুরু করে আপনি ব্যবহার করতে পারেন UIGraphicsImageRenderer:

extension UIImage {

    func colored(_ color: UIColor) -> UIImage {
        let renderer = UIGraphicsImageRenderer(size: size)
        return renderer.image { context in
            color.setFill()
            self.draw(at: .zero)
            context.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height), blendMode: .sourceAtop)
        }
    }

}

6

সুইফট 4.2 সমাধান

extension UIImage {
    func withColor(_ color: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        guard let ctx = UIGraphicsGetCurrentContext(), let cgImage = cgImage else { return self }
        color.setFill()
        ctx.translateBy(x: 0, y: size.height)
        ctx.scaleBy(x: 1.0, y: -1.0)
        ctx.clip(to: CGRect(x: 0, y: 0, width: size.width, height: size.height), mask: cgImage)
        ctx.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))
        guard let colored = UIGraphicsGetImageFromCurrentImageContext() else { return self }
        UIGraphicsEndImageContext()
        return colored
    }
}

// Usage:
// let redImage = UIImage().withColor(.red)

3

যদি আপনাকে প্রোগ্রামগতভাবে এটি না করতে হয় তবে আপনি কেবল এটি Xcode UI ব্যবহার করে করতে পারেন।

আপনি যদি আপনার চিত্রের সম্পদ ফোল্ডারে চিত্রটিতে যান, ডানদিকে পরিদর্শকটি খুলুন এবং নীচের বিকল্পগুলির সাথে একটি "রেন্ডার অ্যাস" ড্রপডাউন রয়েছে:

  1. ডিফল্ট
  2. আসল
  3. টেমপ্লেট

একবার আপনি টেমপ্লেট নির্বাচনটি তৈরি করার পরে, আপনি চান ইমেজটির টিন্ট কালার পরিবর্তন করতে পারেন - এটি Xcode স্টোরিবোর্ড UI ব্যবহার করছে বা প্রোগ্রামগতভাবে।

এখানে চিত্র বর্ণনা লিখুন

এই চিত্রটি দেখুন:

এখানে চিত্র বর্ণনা লিখুন


আপনি কি এক্সকোডি 8 ব্যবহার করছেন?
ডক্সসি

2

এখানে @ আন্নার উত্তরটির আমার অভিযোজন। এখানে দুটি মূল বিষয়:

  • destinationInমিশ্রণ মোড ব্যবহার করুন
  • UIGraphicsBeginImageContextWithOptions(backgroundSize, false, UIScreen.main.scale)মসৃণ চিত্র পেতে কল করুন

সুইফ্ট 3 তে কোড :

extension UIImage {

    static func coloredImage(image: UIImage?, color: UIColor) -> UIImage? {

        guard let image = image else {
            return nil
        }

        let backgroundSize = image.size
        UIGraphicsBeginImageContextWithOptions(backgroundSize, false, UIScreen.main.scale)

        let ctx = UIGraphicsGetCurrentContext()!

        var backgroundRect=CGRect()
        backgroundRect.size = backgroundSize
        backgroundRect.origin.x = 0
        backgroundRect.origin.y = 0

        var r:CGFloat = 0
        var g:CGFloat = 0
        var b:CGFloat = 0
        var a:CGFloat = 0
        color.getRed(&r, green: &g, blue: &b, alpha: &a)
        ctx.setFillColor(red: r, green: g, blue: b, alpha: a)
        ctx.fill(backgroundRect)

        var imageRect = CGRect()
        imageRect.size = image.size
        imageRect.origin.x = (backgroundSize.width - image.size.width) / 2
        imageRect.origin.y = (backgroundSize.height - image.size.height) / 2

        // Unflip the image
        ctx.translateBy(x: 0, y: backgroundSize.height)
        ctx.scaleBy(x: 1.0, y: -1.0)

        ctx.setBlendMode(.destinationIn)
        ctx.draw(image.cgImage!, in: imageRect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }
}

4
ইউআইআইমেজ প্রসারিত করার সময় আপনি কেন চিত্রটি পাস করবেন? আপনার নিজের পদ্ধতির স্থির কীওয়ার্ডটি মুছে ফেলা উচিত এবং কেবল selfআপনার পদ্ধতির অভ্যন্তরে ব্যবহার করুন এবং অপ্রয়োজনীয় চিত্রের প্যারামিটারটি সরাতে হবে
লিও ডাবাস

1

@ আন্নার উত্তরের ভিত্তিতে এবং আমি দ্রুত 2.2-র জন্য আবার লিখি এবং আলফা চ্যানেলের সাহায্যে চিত্রটি পরিচালনা করি:

static func multiplyImageByConstantColor(image:UIImage,color:UIColor)->UIImage{
    let backgroundSize = image.size
    UIGraphicsBeginImageContext(backgroundSize)

    let ctx = UIGraphicsGetCurrentContext()

    var backgroundRect=CGRect()
    backgroundRect.size = backgroundSize
    backgroundRect.origin.x = 0
    backgroundRect.origin.y = 0

    var r:CGFloat = 0
    var g:CGFloat = 0
    var b:CGFloat = 0
    var a:CGFloat = 0
    color.getRed(&r, green: &g, blue: &b, alpha: &a)
    CGContextSetRGBFillColor(ctx, r, g, b, a)

    // Unflip the image
    CGContextTranslateCTM(ctx, 0, backgroundSize.height)
    CGContextScaleCTM(ctx, 1.0, -1.0)
    CGContextClipToMask(ctx, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
    CGContextFillRect(ctx, backgroundRect)

    var imageRect=CGRect()
    imageRect.size = image.size
    imageRect.origin.x = (backgroundSize.width - image.size.width)/2
    imageRect.origin.y = (backgroundSize.height - image.size.height)/2


    CGContextSetBlendMode(ctx, .Multiply)
    CGContextDrawImage(ctx, imageRect, image.CGImage)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage
}

0

আঙ্কার কোডটি কোনও রঙিন .আইমেজ ব্যাকগ্রাউন্ডে কেসিব্লেন্ডমোডমর্মল্টিপ্লাইয়ের পরিবর্তে কেসিবিগ্লেন্ডমড নর্মাল ব্যবহার করে একটি ইউআইআইমেজ.আইমেজ অনুলিপি করার জন্য ভাল কাজ করে। উদাহরণস্বরূপ, self.mainImage.image = [self NormalImageByConstantColor: self.mainImage.image withColor: yourColor];মেইল ইমেজ.আইমেজের সামগ্রীগুলি আপনার রঙের অস্বচ্ছতা সংরক্ষণের সময় আপনার রঙের রঙের উপরে রাখবে। এটি কোনও চিত্রের পিছনে অস্বচ্ছতার সাথে ব্যাকগ্রাউন্ড রঙ রাখার আমার সমস্যার সমাধান করে যা ক্যামেরা রোলে সংরক্ষণ করা যায়।


0

সুইফট 3:

extension UIImage{

    static func multiplyImageByConstantColor(image:UIImage,color:UIColor) -> UIImage{

        let backgroundSize = image.size
        UIGraphicsBeginImageContext(backgroundSize)

        guard let ctx = UIGraphicsGetCurrentContext() else {return image}

        var backgroundRect=CGRect()
        backgroundRect.size = backgroundSize
        backgroundRect.origin.x = 0
        backgroundRect.origin.y = 0

        var r:CGFloat = 0
        var g:CGFloat = 0
        var b:CGFloat = 0
        var a:CGFloat = 0
        color.getRed(&r, green: &g, blue: &b, alpha: &a)
        ctx.setFillColor(red: r, green: g, blue: b, alpha: a)

        // Unflip the image
        ctx.translateBy(x: 0, y: backgroundSize.height)
        ctx.scaleBy(x: 1.0, y: -1.0)
        ctx.clip(to: CGRect(0, 0, image.size.width, image.size.height), mask: image.cgImage!)
        ctx.fill(backgroundRect)


        var imageRect=CGRect()
        imageRect.size = image.size
        imageRect.origin.x = (backgroundSize.width - image.size.width)/2
        imageRect.origin.y = (backgroundSize.height - image.size.height)/2


        ctx.setBlendMode(.multiply)
        ctx.draw(image.cgImage!, in: imageRect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }
}

0

আনা এর দুর্দান্ত কোডটির সুইফট 3.0 সংস্করণ:

extension UIImage{

    static func multiplyImageByConstantColor(image:UIImage,color:UIColor)-> UIImage {
        let backgroundSize = image.size
        UIGraphicsBeginImageContext(backgroundSize)

        let ctx = UIGraphicsGetCurrentContext()!

        var backgroundRect=CGRect()
        backgroundRect.size = backgroundSize
        backgroundRect.origin.x = 0
        backgroundRect.origin.y = 0

        let myFloatForR = 0
        var r = CGFloat(myFloatForR)
        let myFloatForG = 0
        var g = CGFloat(myFloatForG)
        let myFloatForB = 0
        var b = CGFloat(myFloatForB)
        let myFloatForA = 0
        var a = CGFloat(myFloatForA)

        color.getRed(&r, green: &g, blue: &b, alpha: &a)
        ctx.setFillColor(red: r, green: g, blue: b, alpha: a)
        ctx.fill(backgroundRect)

        var imageRect=CGRect()
        imageRect.size = image.size
        imageRect.origin.x = (backgroundSize.width - image.size.width)/2
        imageRect.origin.y = (backgroundSize.height - image.size.height)/2

        // Unflip the image
        ctx.translateBy(x: 0, y: backgroundSize.height)
        ctx.scaleBy(x: 1.0, y: -1.0)

        ctx.setBlendMode(.multiply)
        ctx.draw(image.cgImage!, in: imageRect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.