2011-10-26 60 views
3

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

有两个图像。

i.stack.imgur.com/KC0Pm.png

源PIC是像上述 ,我想将其更改为:

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

是有什么错吗?

感谢

回答

1

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

+0

感谢您的帮助 – guoxj

+0

仍然有问题。 – guoxj

0

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

它宣称,像这样:

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

所以,你需要三个图像来模拟这一点。

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

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

5

stretchableImageWithLeftCapWidth:topCapHeight:(高达4.3)或resizableImageWithCapInsets: iOS 5中

相关问题