كيف أقوم بتلوين صورة برمجيًا على iPhone؟


Answers

في iOS7 ، قاموا بتقديم خاصية tintColor على UIImageView و renderingMode على UIImage. لتلوين UIImage على iOS7 ، كل ما عليك القيام به هو:

UIImageView* imageView = …
UIImage* originalImage = …
UIImage* imageForRendering = [originalImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
imageView.image = imageForRendering;
imageView.tintColor = [UIColor redColor]; // or any color you want to tint it with
Question

أرغب في لصق صورة ذات مرجع لون. يجب أن تبدو النتائج كوضع المزج المتعدد في Photoshop ، حيث سيتم استبدال اللون الأبيض بـ:

سأقوم بتغيير قيمة اللون بشكل مستمر.

متابعة: أود أن أضع الشفرة للقيام بذلك في drawRect الخاص بي في ImageView ، أليس كذلك؟

وكما هو الحال دائمًا ، سيساعد مقتطف الشفرة كثيرًا في فهمه ، على عكس الرابط.

تحديث: Subclassing a UIImageView مع الرمز رامين المقترح.

أضع هذا في viewDidLoad: من جهاز العرض الخاص بي:

[self.lena setImage:[UIImage imageNamed:kImageName]];
[self.lena setOverlayColor:[UIColor blueColor]];
[super viewDidLoad];

أرى الصورة ، ولكن لا يتم تلوينها. لقد حاولت أيضًا تحميل صور أخرى ، وتعيين الصورة في IB ، واستدعاء setNeedsDisplay: في جهاز العرض الخاص بي.

تحديث : drawRect: لا يسمى.

التحديث الأخير: وجدت مشروعًا قديمًا تم إعداد imageView له بشكل صحيح حتى أتمكن من اختبار رمز Ramin ويعمل مثل السحر!

التحديث النهائي النهائي:

لأولئك منكم تعلم فقط عن Core Graphics ، هنا هو أبسط شيء يمكن أن ينجح.

في UIView subclassed الخاص بك:

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColor(context, CGColorGetComponents([UIColor colorWithRed:0.5 green:0.5 blue:0 alpha:1].CGColor)); // don't make color too saturated

    CGContextFillRect(context, rect); // draw base

    [[UIImage imageNamed:@"someImage.png"] drawInRect: rect blendMode:kCGBlendModeOverlay alpha:1.0]; // draw image
}



الشيء الوحيد الذي يمكنني التفكير فيه هو إنشاء عرض مستطيل شفاف في الغالب باللون المطلوب ووضعه على عرض الصور الخاص بك عن طريق إضافته كعرض فرعي. لست متأكدا مما إذا كان هذا سيعمل على صبغ الصورة بالطريقة التي تتخيلها ، أنا لست متأكدًا من كيفية اختراق صورة معينة واستبدال بعض الألوان بشكل انتقائي مع الآخرين ... يبدو لي طموحًا للغاية.

فمثلا:

UIImageView *yourPicture = (however you grab the image);
UIView *colorBlock = [[UIView alloc] initWithFrame:yourPicture.frame];
//Replace R G B and A with values from 0 - 1 based on your color and transparency
colorBlock.backgroundColor = [UIColor colorWithRed:R green:G blue:B alpha:A];
[yourPicture addSubView:colorBlock];

وثائق UIColor:

colorWithRed:green:blue:alpha:

Creates and returns a color object using the specified opacity and RGB component values.

+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha

Parameters

red    - The red component of the color object, specified as a value from 0.0 to 1.0.

green  - The green component of the color object, specified as a value from 0.0 to 1.0.

blue   - The blue component of the color object, specified as a value from 0.0 to 1.0.



alpha  - The opacity value of the color object, specified as a value from 0.0 to 1.0.

Return Value

The color object. The color information represented by this object is in the device RGB colorspace. 



أردت أن أقوم بتلوين صورة باستخدام ألفا وأنشأت الفصل التالي. يرجى إخباري إذا وجدت أي مشاكل في ذلك.

قمت بتسمية CSTintedImageView class CSTintedImageView من UIView لأن UIImageView لا UIImageView drawRect: method ، كما هو مذكور في الردود السابقة. لقد قمت بتعيين مُهيئ مُعَدَّل مشابهًا UIImageView الموجود في فئة UIImageView .

الاستعمال:

CSTintedImageView * imageView = [[CSTintedImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];
imageView.tintColor = [UIColor redColor];

CSTintedImageView.h

@interface CSTintedImageView : UIView

@property (strong, nonatomic) UIImage * image;
@property (strong, nonatomic) UIColor * tintColor;

- (id)initWithImage:(UIImage *)image;

@end

CSTintedImageView.m

#import "CSTintedImageView.h"

@implementation CSTintedImageView

@synthesize image=_image;
@synthesize tintColor=_tintColor;

- (id)initWithImage:(UIImage *)image
{
    self = [super initWithFrame:CGRectMake(0, 0, image.size.width, image.size.height)];

    if(self)
    {
        self.image = image;

        //set the view to opaque
        self.opaque = NO;
    }

    return self;
}

- (void)setTintColor:(UIColor *)color
{
    _tintColor = color;

    //update every time the tint color is set
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();    

    //resolve CG/iOS coordinate mismatch
    CGContextScaleCTM(context, 1, -1);
    CGContextTranslateCTM(context, 0, -rect.size.height);

    //set the clipping area to the image
    CGContextClipToMask(context, rect, _image.CGImage);

    //set the fill color
    CGContextSetFillColor(context, CGColorGetComponents(_tintColor.CGColor));
    CGContextFillRect(context, rect);    

    //blend mode overlay
    CGContextSetBlendMode(context, kCGBlendModeOverlay);

    //draw the image
    CGContextDrawImage(context, rect, _image.CGImage);    
}

@end



UIImage * image = mySourceImage;
UIColor * color = [UIColor yellowColor];  
UIGraphicsBeginImageContext(image.size);
[image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height) blendMode:kCGBlendModeNormal alpha:1];
UIBezierPath * path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, image.size.width, image.size.height)];
[color setFill];
[path fillWithBlendMode:kCGBlendModeMultiply alpha:1]; //look up blending modes for your needs
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//use newImage for something



لأولئك منكم الذين يحاولون فئة فرعية فئة UIImageView وتتعثر في "drawRect: لا يتم استدعاء" ، لاحظ أنه يجب تصنيف فئة UIView بدلاً من ذلك ، لأنه بالنسبة لفئات UIImageView ، لا يتم استدعاء الأسلوب "drawRect:". اقرأ المزيد هنا: drawRect لا يتم استدعاء في الفئة الفرعية من UIImageView