2010-02-20 2 views
1

기본 이미지 위에 사용자 정의 반투명 이미지를 오버레이하려고합니다. 오버레이 이미지가 신축성과 같이 작성됩니다UIImages를 합성 할 때 이미지 컨텍스트가 아티팩트를 생성합니다.

그럼이 버튼의 배경 이미지에 그것을 오버레이하는 방법에 그를 통과
[[UIImage imageNamed:@"overlay.png"] stretchableImageWithLeftCapWidth:5.0 topCapHeight:5.0] 

: 결과 overlaidImage 대부분 올바른 보이는

- (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]; 
} 

, 정확한 크기이고, 알파는 정확하게 블렌딩되지만, 수직 아티팩트/노이즈가 있습니다. 일부는 (비 이미지를 뻗어 완전히에 내가 생각하는)이 아티팩트를 줄일 - (http://acaciatreesoftware.com/img/UIImage-artifacts.png에서 예)

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

내가 먼저 컨텍스트를 삭제 한 후 PNG 압축을 해제했습니다.

누군가 이런 종류의 유물이 발생하지 않고 신축성있는 UIImages를 그리는 방법을 알고 있습니까?

+1

'-stretchableImage ...'는 정수로 입력을 취합니다. '5.0'대신 '5'를 전달하십시오 (이는 문제를 해결하지 못합니다). – kennytm

+0

감사합니다. 나는 gcc가 그것에 대해 불평하지 않는 것에 놀랐다. 나는 그래픽 크기에 너무 익숙하지 못했다는 것을 알지도 못했다. –

+1

C의 자동 유형 강등은 5.0이 합법적이고 유효한 int 인수가되도록합니다. 따라서 유형 검사는 경고를 발생시키지 않습니다. 하지만 gcc가 강등 경고를 제공하지 않는 것 같아서 놀랍습니다. – danielpunkass

답변

0

그래서 대답은 다음과 같습니다. 대신 오버레이를 절차 적으로 칠할 수 있습니다. 좋아요 :

0

원본 이미지가 너무 약하고 축소되는 것이 아니라 강요하고 있습니까? 동일한 가로 세로 비율에 맞게 크기가 축소 된 이미지에서 최상의 결과를 발견했습니다. 문제가 해결되지 않을 수도 있습니다.

+0

흥미 롭습니다. 나는 그것을 시도 할 것이다. –

관련 문제