기본 이미지 위에 사용자 정의 반투명 이미지를 오버레이하려고합니다. 오버레이 이미지가 신축성과 같이 작성됩니다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를 그리는 방법을 알고 있습니까?
'-stretchableImage ...'는 정수로 입력을 취합니다. '5.0'대신 '5'를 전달하십시오 (이는 문제를 해결하지 못합니다). – kennytm
감사합니다. 나는 gcc가 그것에 대해 불평하지 않는 것에 놀랐다. 나는 그래픽 크기에 너무 익숙하지 못했다는 것을 알지도 못했다. –
C의 자동 유형 강등은 5.0이 합법적이고 유효한 int 인수가되도록합니다. 따라서 유형 검사는 경고를 발생시키지 않습니다. 하지만 gcc가 강등 경고를 제공하지 않는 것 같아서 놀랍습니다. – danielpunkass