2014-10-01 4 views
2

Я пытаюсь создать эффект, который выглядит так, как будто два изображения вплетены друг в друга. Поэтому я масштабировал первое изображение, чтобы быть фоном, и я перебираю второе изображение, используя несколько UIIMageViews поверх фона, чтобы дать мне желаемый вид. Это работает, когда я использую изображения, которые не нужно масштабировать, чтобы они соответствовали размеру моего дисплея, но когда я использую UIGraphics для изменения размера изображения, у меня возникает проблема, когда изображение теряет качество. Любые предложения будут ценны.Как использовать CGImageRef для перебора частей изображения, размер которого был изменен без увеличения пикселизации?

Image 1.jpg 2112 × 2816

Image 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&t=967&sid=b1096cb20757776f3259c1bd8f7db7ee –

ответ

1

я был в состоянии исправить мою проблему, изменив вторую строчку в моем цикле, чтобы:

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

Мой предыдущий выход был отключен в 2 раза, но я не знаю, почему это было так, чтобы начать с.

Любое понимание оценено.

+1

Я думаю, что ваш выход может быть отключен, потому что вы рисуете 'frontImage' (изображение с масштабом '1.0') в графическом контексте с« шкалой »' 2.0'. Попробуйте запустить свой новый код в симуляторе, отличном от Retina, - если я прав, ваше дополнение '* 2' нарушит визуализацию изображения другим способом. –

+0

Протестировано на тренажере не сетчатки, и вы были правы! Благодаря! – sfbarry14