2011-02-28 86 views
5

兩件事情我想做的事情,這是相關的:如何爲圖像着色/顯示顏色?

  1. 顯示任何顏色的塊。所以我可以隨時將這種顏色改變成別的東西。
  2. 色調UIImage是不同的顏色。阿爾法被關閉的顏色疊加在這裏可以工作,但是說它是一個透明背景的圖像,並沒有佔據整個圖像的正方形。

任何想法?

回答

10

第一個很容易。製作一個新的UIView並將其背景顏色設置爲任何你喜歡的顏色。

第二個比較困難。正如你所提到的,你可以在透明度被拒絕的情況下放置一個新的視圖,但爲了讓它在相同的地方剪輯,你需要使用一個蒙版。這樣的事情:

UIImage *myImage = [UIImage imageNamed:@"foo.png"]; 

UIImageView *originalImageView = [[UIImageView alloc] initWithImage:myImage]; 
[originalImageView setFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)]; 
[parentView addSubview:originalImageView]; 

UIView *overlay = [[UIView alloc] initWithFrame:[originalImageView frame]]; 

UIImageView *maskImageView = [[UIImageView alloc] initWithImage:myImage]; 
[maskImageView setFrame:[overlay bounds]]; 

[[overlay layer] setMask:[maskImageView layer]]; 

[overlay setBackgroundColor:[UIColor redColor]]; 

[parentView addSubview:overlay]; 

請記住,您將不得不在#import <QuartzCore/QuartzCore.h>執行文件中。

+0

我有一些困難得到hori zontal居中工作。起初,我將覆蓋圖添加爲UITableViewCell的子視圖,並且在調整單元格大小時丟失了居中。我通過添加覆蓋作爲單元格內的UILabel字段的子視圖來解決此問題,而不是UITableViewCell本身。 – bneely

+1

您也可以嘗試將其添加到表格視圖單元格的「contentView」中。 –

2

實現1的一個簡單方法是創建UILabel甚至UIView並根據需要更改backgroundColor。

有一種方法可以乘以顏色,而不是僅僅覆蓋它們,這應該適用於2.請參閱this tutorial

11

另一種選擇,是使用的分類方法上的UIImage這樣的...

// Tint the image, default to half transparency if given an opaque colour. 
- (UIImage *)imageWithTint:(UIColor *)tintColor { 
    CGFloat white, alpha; 
    [tintColor getWhite:&white alpha:&alpha]; 
    return [self imageWithTint:tintColor alpha:(alpha == 1.0 ? 0.5f : alpha)]; 
} 

// Tint the image 
- (UIImage *)imageWithTint:(UIColor *)tintColor alpha:(CGFloat)alpha { 

    // Begin drawing 
    CGRect aRect = CGRectMake(0.f, 0.f, self.size.width, self.size.height); 
    UIGraphicsBeginImageContext(aRect.size); 

    // Get the graphic context 
    CGContextRef c = UIGraphicsGetCurrentContext(); 

    // Converting a UIImage to a CGImage flips the image, 
    // so apply a upside-down translation 
    CGContextTranslateCTM(c, 0, self.size.height); 
    CGContextScaleCTM(c, 1.0, -1.0); 

    // Draw the image 
    [self drawInRect:aRect]; 

    // Set the fill color space 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextSetFillColorSpace(c, colorSpace); 

    // Set the mask to only tint non-transparent pixels 
    CGContextClipToMask(c, aRect, self.CGImage); 

    // Set the fill color 
    CGContextSetFillColorWithColor(c, [tintColor colorWithAlphaComponent:alpha].CGColor); 

    UIRectFillUsingBlendMode(aRect, kCGBlendModeColor); 

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

    // Release memory 
    CGColorSpaceRelease(colorSpace); 

    return img; 
} 
+0

這是好的,但透明的像素着色 – zxcat

+2

1)要修復「透明像素着色了,」添加'CGContextClipToMask(c,aRect,self.CGImage);'在'UIRectFillUsingBlendMode'之前。 2)要應用真實色調,保留圖像值,請使用kCGBlendModeColor。 – Wienke

+1

這會使圖像翻轉倒置。獲取上下文後,需要添加以下行:\t 'CGContextTranslateCTM(c,0,self.size.height); CGContextScaleCTM(c,1.0,-1。0);' – chitza

-1

試試這個

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     UIView* maskedView = [self filledViewForPNG:[UIImage imageNamed:@"mask_effect.png"] 
               mask:[UIImage imageNamed:@"mask_image.png"] 
              maskColor:[UIColor colorWithRed:.6 green:.2 blue:.7 alpha:1]]; 


     [self.view addSubview:maskedView]; 

    } 

    -(UIView*)filledViewForPNG:(UIImage*)image mask:(UIImage*)maskImage maskColor:(UIColor*)maskColor 
    { 
     UIImageView *pngImageView = [[UIImageView alloc] initWithImage:image]; 
     UIImageView *maskImageView = [[UIImageView alloc] initWithImage:maskImage]; 

     CGRect bounds; 
     if (image) { 
      bounds = pngImageView.bounds; 
     } 
     else 
     { 
      bounds = maskImageView.bounds; 
     } 
     UIView* parentView = [[UIView alloc]initWithFrame:bounds]; 
     [parentView setAutoresizesSubviews:YES]; 
     [parentView setClipsToBounds:YES]; 

     UIView *overlay = [[UIView alloc] initWithFrame:bounds]; 
     [[overlay layer] setMask:[maskImageView layer]]; 
     [overlay setBackgroundColor:maskColor]; 

     [parentView addSubview:overlay]; 
     [parentView addSubview:pngImageView]; 
     return parentView; 
    } 
+0

請解釋您的答案。 – hims056

4

這裏是實現圖像着色的另一種方式,特別是如果你已經使用QuartzCore做其他事情。

進口QuartzCore:

#import <QuartzCore/QuartzCore.h>  

創建透明的CALayer,並添加爲圖像的子層要色調:

CALayer *sublayer = [CALayer layer]; 
[sublayer setBackgroundColor:[UIColor whiteColor].CGColor]; 
[sublayer setOpacity:0.3]; 
[sublayer setFrame:toBeTintedImage.frame]; 
[toBeTintedImage.layer addSublayer:sublayer]; 

添加QuartzCore到項目框架列表(如果它不是」 t已經在那裏),否則你會得到像這樣的編譯器錯誤:

Undefined symbols for architecture i386: "_OBJC_CLASS_$_CALayer"