2014-10-01 1 views
2

2 개의 이미지가 서로 짜여진 것처럼 보이는 효과를 만들려고합니다. 그래서 첫 번째 이미지를 배경으로 조정했고 배경 위에 여러 개의 UIIMageViews를 사용하여 두 번째 이미지를 반복하면서 원하는 모양을 제공합니다. 이 기능은 크기에 맞춰서 표시 할 필요가없는 이미지를 사용할 때 작동하지만 UIGraphics를 사용하여 이미지의 크기를 조정할 때 이미지의 품질이 떨어지는 문제가 발생합니다. 어떤 제안이라도 대단히 감사하겠습니다.CGImageRef를 사용하여 픽셀 화를 늘리지 않고 크기가 조정 된 이미지의 일부분을 반복 재생하려면 어떻게해야합니까?

이미지 1.JPG는 2112 × 2816

이미지 2.JPG는 2000 × 3008 나는 내 루프에서 두 번째 줄을 변경하여 내 문제를 해결할 수 있었다

UIImage *bgImage = [UIImage imageNamed:@"1.jpg"]; 
UIImageView *bgView = [[UIImageView alloc] initWithImage:bgImage]; 
bgView.contentMode = UIViewContentModeScaleToFill; 
bgView.frame = CGRectMake(0,0,CGRectGetWidth(self.view.frame), (CGRectGetWidth(self.view.frame)/bgImage.size.width) * bgImage.size.height); 

bgView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 
[self.view addSubview:bgView]; 

UIImage *frontImage = [UIImage imageNamed:@"2.jpg"]; 
CGSize newSize = CGSizeMake(CGRectGetWidth(self.view.frame), (CGRectGetWidth(self.view.frame)/frontImage.size.width) * frontImage.size.height); 
UIGraphicsBeginImageContextWithOptions(newSize, YES, 0.0); 
[frontImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

int count = 0; 
int varX = 10; 
int varY = 10; 

CGFloat width = self.view.frame.size.width; 
CGFloat height = self.view.frame.size.height; 
CGFloat tileWidth = width/varX; 
CGFloat tileHeight = height/varY; 

for (int x = 0; x < varX; x++) { 
    for (int y = 0; y < varY; y++) { 

     NSLog(@"%f, %f, %f, %f",x*tileWidth, y*tileHeight, tileWidth, tileHeight); 

     CGImageRef scaledRef = CGImageCreateWithImageInRect(scaledImage.CGImage, CGRectMake(x*tileWidth, y*tileHeight, tileWidth, tileHeight)); 
     UIImage *image = [UIImage imageWithCGImage:scaledRef scale:scaledImage.scale orientation:scaledImage.imageOrientation]; 
     UIImageView *bgx = [[UIImageView alloc] initWithImage:image]; 
     CGImageRelease(scaledRef); 

     bgx.frame = CGRectMake((x*tileWidth), (y*tileHeight), tileWidth, tileHeight); 
     bgx.backgroundColor = [UIColor yellowColor]; 
     bgx.contentMode = UIViewContentModeTopLeft; 

     if(count%2==0){ 
      [self.view addSubview:bgx]; 
     } 
     count++; 
    } 
    count++; 
} 
+0

위 또는 아래로 크기를 조정하는 것이 확실하지 않습니다. 확대하면 항상 이미지 품질이 떨어집니다. 일반적인 스케일링을 위해, 나는이 UIImage 카테고리를 수년 동안 사용했다. http://www.catamount.com/forums/viewtopic.php?f=21&topic.php?f=21&t=967&sid=b1096cb20757776f3259c1bd8f7db7ee –

답변

1

:

CGImageRef scaledRef = CGImageCreateWithImageInRect(scaledImage.CGImage, CGRectMake(x*(tileWidth*2), y*(tileHeight*2), tileWidth*2, tileHeight*2)); 

내 이전 출력은 2 배로 떨어졌지만 왜 시작했는지는 알 수 없습니다.

모든 의견에 감사드립니다.

+1

'frontImage'를 그리기 때문에 출력이 꺼져 있을지도 모른다. ('scale'이 '1.0'인 이미지)를 그래픽 콘텍스트에서 'scale'이 '2.0'으로 정의한다. 레티 나가 아닌 시뮬레이터에서 새 코드를 실행 해보십시오. 제가 맞으면'* 2 '를 추가하면 이미지 렌더링이 다른 방식으로 중단됩니다. –

+0

비 망막 시뮬레이터에서 테스트 해 보았습니다! 감사! – sfbarry14

관련 문제