2009-08-03 33 views
34

Tôi rất muốn biết cách tô màu một hình ảnh (ví dụ như tạo màu trắng .png đỏ). Tôi đã thấy các đề xuất khác nhau nhưng không bao giờ xác nhận rằng điều này thực sự có thể. Tôi đã thử điều này:iPhone - Làm thế nào để bạn tô màu một hình ảnh?

-(UIImage *)colorizeImage:(UIImage *)baseImage color:(UIColor *)theColor { 
    UIGraphicsBeginImageContext(baseImage.size); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGRect area = CGRectMake(0, 0, baseImage.size.width, baseImage.size.height); 

    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -area.size.height); 
    CGContextSaveGState(ctx); 
    CGContextClipToMask(ctx, area, baseImage.CGImage); 
    [theColor set]; 
    CGContextFillRect(ctx, area); 
    CGContextRestoreGState(ctx); 
    CGContextSetBlendMode(ctx, kCGBlendModeNormal); 
    CGContextDrawImage(ctx, area, baseImage.CGImage); 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

myImageView.image = [self colorizeImage:[UIImage imageNamed:@"whiteImage.png"] color:[UIColor redColor]]; 

Nhưng nó không hoạt động - hình ảnh vẫn còn màu trắng trên màn hình.

+0

Nhưng chính xác thì bạn đang cố gắng làm gì? Bạn đang cố gắng biến tất cả các điểm ảnh có màu trắng hoàn toàn (RGB (255,255,255)) thành màu đỏ? Bạn chỉ muốn thêm một màu đỏ? Là "whiteImage.png" của bạn thực sự chỉ là một hình chữ nhật lớn của tất cả các màu trắng? – Amagrammer

+0

Có, tôi muốn chuyển các pixel màu trắng (hoặc màu xám) thành màu đỏ. Phần trong suốt của png sẽ vẫn trong suốt. whiteImage.png không phải là một hình chữ nhật màu trắng - đó là một hình ảnh của một con vật, ví dụ. –

+0

Có lý do cụ thể nào khiến bạn không thể có phiên bản màu đỏ của cùng một hình ảnh và chuyển đổi giữa chúng khi cần? Hình ảnh màu bi nén rất nhỏ. – Amagrammer

Trả lời

0

Nếu bạn đặt backgroundColor của UIImageView thành [UIColor redColor], các phần của PNG gốc là trong suốt sẽ trở thành màu đỏ. Ngoài ra, bạn có thể thử thêm UIView nửa trong suốt với màu nền đỏ làm chế độ xem phụ của lần xem hình ảnh. Điều này sẽ thêm một đám mây màu đỏ để xem hiển thị hình ảnh.

+1

Cảm ơn, nhưng tôi muốn tô màu các pixel chỉ hiện diện, không phải toàn bộ hình chữ nhật. –

0

Bạn đang vẽ màu đầu tiên, sau đó vẽ hình ảnh lên trên nó. Trừ khi hình ảnh là một phần trong suốt, nó sẽ hoàn toàn overdraw màu nền. Tôi khuyên bạn nên cố gắng vẽ hình ảnh gốc trước, sau đó vẽ màu đỏ lên trên nó bằng cách sử dụng kCGBlendModeHue.

Tôi không chắc chắn lý do bạn lật và dịch ngữ cảnh của mình. Ảnh của bạn có bị lộn ngược không?

1

Được rồi, thế nào?

Trong giai đoạn tạo nội dung của bạn (KHÔNG động trong khi ứng dụng đang chạy), đảo ngược bảng màu của hình ảnh của bạn. Phần bây giờ là màu trắng -> trong suốt. Một phần mà bây giờ là trong suốt -> bất kể nền của trang là gì.

Dưới mỗi hình ảnh, đặt chế độ xem trống màu trắng có cùng kích thước. Khi bạn muốn chuyển hình ảnh sang màu đỏ, hãy thay đổi màu của chế độ xem trắng trống thành màu đỏ.

Điều đó có thể thực hiện được không?

12

Thay đổi chế độ hòa trộn của bạn để nhân và mã của bạn sẽ làm việc:

CGContextSetBlendMode(ctx, kCGBlendModeMultiply); 
+1

+1 Cảm ơn nó đã làm việc cho tôi. Trước khi tôi chỉ nhận được màu trắng, bây giờ nó hoạt động tốt. – HDdeveloper

1

đứa trẻ @geek, cho tôi biết nếu điều này giúp u dude ...

// translate/flip the graphics context (for transforming from CG* coords to UI* coords) 
CGContextTranslateCTM(context, 0, img.size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 

// thay thế "ngữ cảnh" với UIGraphicsGetCurrentContext() hoặc nếu u có phiên bản ngữ cảnh hiện tại.

Hy vọng điều đó sẽ hữu ích.

63

Biến đây thành danh mục UIImage. Nó cũng tính đến yếu tố tỷ lệ với iOS 4.

- (UIImage *)imageWithOverlayColor:(UIColor *)color 
{   
    CGRect rect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height); 

    if (UIGraphicsBeginImageContextWithOptions) { 
     CGFloat imageScale = 1.0f; 
     if ([self respondsToSelector:@selector(scale)]) // The scale property is new with iOS4. 
      imageScale = self.scale; 
     UIGraphicsBeginImageContextWithOptions(self.size, NO, imageScale); 
    } 
    else { 
     UIGraphicsBeginImageContext(self.size); 
    } 

    [self drawInRect:rect]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(context, kCGBlendModeSourceIn); 

    CGContextSetFillColorWithColor(context, color.CGColor); 
    CGContextFillRect(context, rect); 

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

    return image; 
} 

CẬP NHẬT - Swift phiên bản:

func imageWithColor(color: UIColor) -> UIImage { 
    let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height) 
    UIGraphicsBeginImageContextWithOptions(self.size, false, 0.0); 
    drawInRect(rect) 
    let context = UIGraphicsGetCurrentContext() 
    CGContextSetBlendMode(context, .SourceIn) 
    CGContextSetFillColorWithColor(context, color.CGColor) 
    CGContextFillRect(context, rect); 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image 
} 
+0

Cảm ơn vì điều này ... chính xác những gì tôi cần để tô màu nền của một tính năng giao diện, dựa trên chủ đề người dùng đã chọn. –

+0

Điều này cũng làm việc cho tôi :) – DivineDesert

+1

+1 Cảm ơn nó đã làm việc cho tôi. Trước khi tôi chỉ nhận được màu trắng, bây giờ {CGContextSetBlendMode (ctx, kCGBlendModeMultiply);} như được nói bởi willc2 hoạt động tốt của nó. – HDdeveloper

10

Tính đến iOS 7, bạn có thể nhuộm màu hình ảnh với một màu duy nhất như vậy

Objective C

UIImage *image = [UIImage imageNamed:@"myImage.png"]; 
UIImageView *imageView = [[UIImageView alloc]initWithImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]]; 
imageView.tintColor = [UIColor redColor]; 

Swift 3

let image = UIImage(named:"myImage.png")?.withRenderingMode(.alwaysTemplate) 
let imageView = UIImageView(image:image) 
imageView.tintColor = .red 

Điều này sẽ tô màu toàn bộ hình ảnh bằng một màu duy nhất và bảo toàn kênh alpha.

+0

hoạt động tốt, cảm ơn bạn! –

2

Tôi nghĩ rằng cách tốt nhất để tô màu cho hình ảnh từ iOS7 là bằng cách xác định tài sản UIImageRenderingModeAlwaysTemplate trên hình ảnh của bạn:

myImageView.image = [[UIImage imageNamed:@"myImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 

và sau đó tô màu cho nó với tintColor của IMAGExem

myImageView.tintColor = [UIColor purpleColor]; //Maybe purple is not the best choice ;) 

Tôi nghĩ rằng việc này dễ dàng hơn (không cần danh mục) và tất nhiên được tối ưu hóa!

Lưu ý: nếu bạn đang sử dụng xcassets, bạn có thể thiết lập thuộc tính vẽ để UIImageRenderingModeAlwaysTemplate trong XCode, giống như trong ảnh chụp màn hình này:

UIImageRenderingModeAlwaysTemplate in XCode

1

ngắn, ngọt ngào và tốt hơn :)

- (UIImage *)colorizeImage:(UIImage *)image withColor:(UIColor *)color

Xác định UIColorFromRGB để sử dụng mã màu hex sau đó chỉ cần gọi colorizeImage:withColor

#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIImage *imgToColor = [UIImage imageNamed:@"myImage.png"]; 
    imgToColor = [self colorizeImage:imgToColor withColor:UIColorFromRGB(0xff00ff)]; 
    // use normal UIColor or UIColorFromRGB() for hex 
} 

- (UIImage *)colorizeImage:(UIImage *)image withColor:(UIColor *)color 
{ 
    CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, [[UIScreen mainScreen] scale]); 
    [image drawInRect:rect]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetBlendMode(context, kCGBlendModeSourceIn); 

    CGContextSetFillColorWithColor(context, color.CGColor); 
    CGContextFillRect(context, rect); 

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 
Các vấn đề liên quan