2010-02-20 53 views
1

我正試圖在基本圖像上覆蓋自定義半透明圖像。覆蓋圖像是可拉伸的和這樣創建的:圖像上下文在合成UIImages時產生僞像

[[UIImage imageNamed:@"overlay.png"] stretchableImageWithLeftCapWidth:5.0 topCapHeight:5.0] 

然後我傳遞關於覆蓋它到背景圖像的按鈕的方法:

- (void)overlayImage:(UIImage *)overlay forState:(UIControlState)state { 
    UIImage *baseImage = [self backgroundImageForState:state];  

    CGRect frame = CGRectZero; 
    frame.size = baseImage.size; 

    // create a new image context 
    UIGraphicsBeginImageContext(baseImage.size);   

    // get context 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // clear context 
    CGContextClearRect(context, frame); 

    // draw images 
    [baseImage drawInRect:frame]; 
    [overlay drawInRect:frame];// blendMode:kCGBlendModeNormal alpha:1.0]; 

    // get UIImage 
    UIImage *overlaidImage = UIGraphicsGetImageFromCurrentImageContext(); 

    // clean up context 
    UIGraphicsEndImageContext(); 

    [self setBackgroundImage:overlaidImage forState:state]; 
} 

所得overlaidImage看起來大多正確,它是正確的大小,alpha是正確混合等,但它有垂直的人爲因素/噪音。

UIImage artifacts example http://acaciatreesoftware.com/img/UIImage-artifacts.png

(例如在http://acaciatreesoftware.com/img/UIImage-artifacts.png

我試圖首先清除上下文,然後關閉PNG壓縮 - 這減少了僞像一些(完全在非拉伸的圖像我想)。

有沒有人知道一種方法繪製可伸縮的UIImages出這種artifacting發生?

+1

'-stretchableImage ...'將整數作爲輸入。通過'5'而不是'5.0'(它不會解決問題)。 – kennytm 2010-02-20 08:39:22

+0

謝謝。我有點驚訝g​​cc並沒有抱怨。我很習慣圖形尺寸浮動,我甚至沒有注意到它不是。 – 2010-02-20 08:50:01

+1

C的自動類型降級使得5.0是一個合法且有效的int參數。因此,類型檢查不會導致警告。但我很驚訝地發現gcc似乎沒有提供降級警告。 – danielpunkass 2010-02-20 13:52:53

回答

0

所以答案是:不要這樣做。相反,您可以在程序上繪製覆蓋圖。像這樣:

- (void)overlayWithColor:(UIColor *)overlayColor forState:(UIControlState)state { 
    UIImage *baseImage = [self backgroundImageForState:state];  

    CGRect frame = CGRectZero; 
    frame.size = baseImage.size; 

    // create a new image context 
    UIGraphicsBeginImageContext(baseImage.size);   

    // get context 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // draw background image 
    [baseImage drawInRect:frame]; 

    // overlay color 
    CGContextSetFillColorWithColor(context, [overlayColor CGColor]); 
    CGContextSetBlendMode(context, kCGBlendModeSourceAtop); 
    CGContextFillRect(context, frame); 

    // get UIImage 
    UIImage *overlaidImage = UIGraphicsGetImageFromCurrentImageContext(); 

    // clean up context 
    UIGraphicsEndImageContext(); 

    [self setBackgroundImage:overlaidImage forState:state]; 
} 
0

你是不是太吝嗇你的原始圖像,並迫使它伸展而不是縮小?我已經找到了適合相同寬高比並縮小尺寸的最佳效果。可能無法解決你的問題。

+0

有趣。我會試一試。 – 2010-02-26 06:55:00