如何重复只有一部分的图像?

如何只重复一部分图像,

有两个图像。

i.stack.imgur.com/KC0Pm.png

源图片是上面的东西,我想改变它:

i.stack.imgur.com/t8CwQ.png

这意味着我只想重复一部分图像? 不拉伸源图片,是否有可能做到这一点?

谢谢更新:

代码在这里: http : //www.box.net/shared/cmtz0e48a5urtajxu4yn仍然有问题!

更新:我裁剪我的图像文件,只是重复部分,但我仍然有一些问题。

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

}

结果是这样的: http : //i.stack.imgur.com/jO0O5.png

有什么不对?

谢谢

stretchableImageWithLeftCapWidth:topCapHeight:最多4.3)或resizableImageWithCapInsets:在iOS 5

使用UIImage,您只能重复图像的1像素宽的部分。 你可以做的最好的事情是裁剪你的图像文件,只是重复你想重复的部分。 你也可以用Core Graphics来做,但是比修改你的文件要复杂得多。

您可以使用NSDrawThreePartImage (仅限OSX)提示一个潜在的解决scheme。

它是这样宣布的:

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

所以你将需要三个图像来模拟这个。

如果你也知道偏移量,你可以用一个图像和一些奇特的CoreGraphics操作来做到这一点。

模拟这个时首先想到的就是使用CGBitmapContext ,然后用上下文将图像绘制到位图上,然后将结果作为位图或CGImage (您可能想要保存结果,因为计算可能是昂贵的)。