¿Cómo repetir solo una parte de una image?

cómo repetir solo parte de una image,

hay dos imágenes

i.stack.imgur.com/KC0Pm.png

la fuente de la image es similar a la anterior y quiero cambiarla a:

i.stack.imgur.com/t8CwQ.png

Esto significa que solo quiero repetir solo una parte de la image. No estirar la image fuente, ¿es posible hacer eso?

gracias actualización:

CÓDIGO AQUÍ: ¡ http://www.box.net/shanetworking/cmtz0e48a5urtajxu4yn todavía tiene un problema!

Actualización: recorto mi file de image y simplemente repito la parte, pero aún tengo un problema.

- (UIImage *)imageWithImage:(NSString *)iconName covertToSize:(CGSize)size { CGRect topLeft,topRight,bottomLeft,bottomRight,top,bottom,left,right; if ([iconName isEqualToString:@"border_baikuang"]) { topLeft = CGRectMake(0, 0, 18, 18); topRight = CGRectMake(108-18, 0, 18, 18); bottomLeft = CGRectMake(0, 104-18, 18, 18); bottomRight = CGRectMake(108-18, 104-18, 18, 18); top = CGRectMake(18, 0, 1, 18); bottom = CGRectMake(18, 104-18, 1, 18); left = CGRectMake(0, 18, 18, 1); right = CGRectMake(108-18, 18, 18, 1); } else if ([iconName isEqualToString:@"border_fuguxiangkuang"]) { topLeft = CGRectMake(0, 0, 28, 28); topRight = CGRectMake(108-28, 0, 28, 28); bottomLeft = CGRectMake(0, 104-28, 28, 28); bottomRight = CGRectMake(108-28, 104-28, 28, 28); top = CGRectMake(28, 0, 28, 24); bottom = CGRectMake(28, 104-28, 28, 24); left = CGRectMake(0, 28, 24, 28); right = CGRectMake(108-24, 28, 24, 28); } float width = size.width; float height = size.height; UIGraphicsBeginImageContext(size); // UIImage *topLeftPattern = [self fetchImgWithSrc:iconName rect:topLeft]; [topLeftPattern drawInRect:CGRectMake(0, 0, topLeftPattern.size.width, topLeftPattern.size.height)]; UIImage *topRightPattern = [self fetchImgWithSrc:iconName rect:topRight]; [topRightPattern drawInRect:CGRectMake(width-topRightPattern.size.width, 0, topRightPattern.size.width, topRightPattern.size.height)]; UIImage *bottomLeftPattern = [self fetchImgWithSrc:iconName rect:bottomLeft]; [bottomLeftPattern drawInRect:CGRectMake(0, height-bottomLeftPattern.size.height, bottomLeftPattern.size.width, bottomLeftPattern.size.height)]; UIImage *bottomRightPattern = [self fetchImgWithSrc:iconName rect:bottomRight]; [bottomRightPattern drawInRect:CGRectMake(width-bottomRightPattern.size.width, height-bottomRightPattern.size.height, bottomRightPattern.size.width, bottomRightPattern.size.height)]; UIImage *topPattern = [self fetchImgWithSrc:iconName rect:top]; [topPattern drawAsPatternInRect:CGRectMake(topLeftPattern.size.width, 0, width-topRightPattern.size.width-topLeftPattern.size.width, topPattern.size.height)]; UIImage *bottomPattern = [self fetchImgWithSrc:iconName rect:bottom]; [bottomPattern drawAsPatternInRect:CGRectMake(bottomLeftPattern.size.width, height-bottomLeftPattern.size.height, width-bottomRightPattern.size.width-bottomLeftPattern.size.width, bottomPattern.size.height)]; UIImage *leftPattern = [self fetchImgWithSrc:iconName rect:left]; [leftPattern drawAsPatternInRect:CGRectMake(0, topLeftPattern.size.height, leftPattern.size.width, height-bottomLeftPattern.size.height-topLeftPattern.size.height)]; UIImage *rightPattern = [self fetchImgWithSrc:iconName rect:right]; [rightPattern drawAsPatternInRect:CGRectMake(width-topRightPattern.size.width, topRightPattern.size.height, rightPattern.size.width, height-bottomRightPattern.size.height - topRightPattern.size.height)]; UIImage *destImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return destImage; 

}

 - (UIImage*)fetchImgWithSrc:(NSString *)iconName rect:(CGRect)clipRect { NSString *completeName = [iconName stringByAppendingString:@".png"]; UIImage *src = [UIImage imageFromFileName:completeName]; NSLog(@"src=%@",NSStringFromCGSize(src.size)); UIImage *tmpPattern = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(src.CGImage, clipRect)]; NSLog(@"dest=%@",NSStringFromCGSize(tmpPattern.size)); return tmpPattern; 

}

el resultado es así: http://i.stack.imgur.com/jO0O5.png

¿Hay algo mal?

Gracias

Hay stretchableImageWithLeftCapWidth:topCapHeight: (hasta 4.3) o resizableImageWithCapInsets: en iOS 5

Con UIImage solo puedes repetir una parte de la image de 1 píxel de ancho. Lo mejor que puede hacer es recortar su file de image y simplemente repetir la parte que desea repetir. También puedes hacerlo con Core Graphics, pero es mucho más complicado que modificar tu file.

Puede usar NSDrawThreePartImage (solo OSX) para get una pista sobre una posible solución.

Se declara así:

 void NSDrawThreePartImage(NSRect frame, NSImage *startCap, NSImage *centerFill, NSImage *endCap, BOOL vertical, NSCompositingOperation op, CGFloat alphaFraction, BOOL flipped ); 

Entonces necesitarás tres imágenes para simular esto.

De hecho, puedes hacer esto con una image y algunas manipulaciones elegantes de CoreGraphics si también conoces las compensaciones.

Lo primero que me viene a la mente cuando simulo esto sería utilizar un CGBitmapContext , luego dibuja las imágenes donde quieras en el bitmap usando el context, luego toma el resultado como un bitmap o CGImage (probablemente quieras save el resultado, porque puede ser costoso calcular).