如何只重复部分图像?

时间:2011-10-26 09:47:42

标签: iphone ios uiimage

如何只重复部分图片,

有两张图片。

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

有什么不对吗?

感谢

3 个答案:

答案 0 :(得分:5)

iOS 5中有stretchableImageWithLeftCapWidth:topCapHeight:(最多4.3)或resizableImageWithCapInsets:

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以使用NSDrawThreePartImage(仅限OSX)提示一个可能的解决方案。

声明如下:

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

所以你需要三张图像才能模拟出来。

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

模拟这个时首先想到的是使用CGBitmapContext,然后使用上下文将图像绘制到位图的位置,然后将结果作为位图或{{ 1}}(您可能希望保存结果,因为计算起来可能很昂贵。)

相关问题