Я пытаюсь создать объект, который может нарисовать часть большого изображения (например, 2048 x 1537) с помощью CGContextDrawImage (...). Он работает просто отлично, за исключением того, что он чрезвычайно размыт. Я использую «drawingController», который переопределяет drawLayer: InContext: как этотCGContextDrawImage рисует большие изображения очень размытым
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx{
CGImageRef drawImage = CGImageRetain(imageToDraw);
if(drawImage) {
CGRect drawRect = CGRectMake(0, 0, 1024, 748);//Just hard coded to my window size for now.
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);
CGContextDrawImage(ctx, drawRect, drawImage);
}
CGImageRelease(drawImage);
}
И это, как я настроил свой пользовательский хостинг изображений вид:
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"large" ofType:@"jpg"];
CGImageRef imageRef = [self createCGImageFromFilePath:filePath];
drawingController = [[DrawingLayerController alloc] init];
drawingController.imageToDraw = imageRef;
[self setWantsLayer:YES];
imageLayer = [[CALayer alloc] init];
imageLayer.frame = self.bounds;
imageLayer.drawsAsynchronously = YES;
imageLayer.delegate = drawingController;
[self.layer addSublayer:imageLayer];
imageLayer.contentsRect = CGRectMake(0.5, 0.265452179, 0.5, 0.486662329); //Just an example contents rect.
imageLayer.drawsAsynchronously = YES;
[imageLayer setNeedsDisplay];
[imageLayer displayIfNeeded];
}
return self;
}
Вот часть изображения созданный вдоль стороны исходного изображения в аналогичной масштабной шкале, открытой в Preview, поэтому вы можете видеть, насколько размыто изображение по сравнению с исходным изображением.
Как вы можете видеть, изображение, полученное с помощью моего кода выглядит УЖАСНО. Что с этим связано?
Также, для полноты, я попытался использовать CATiledLayer для своего ImageLayer. Полученное изображение выглядит так же ужасно.
Замечание: код должен быть совместим с iOS и OSX, но я выполняю все свои тесты на OSX.
EDIT: Благодаря @Andrea, я добавил выше CGContextDrawImage (...) Следующий
CGFloat scale = MAX(1,MAX(CGImageGetWidth(drawImage)/drawRect.size.width,CGImageGetHeight(drawImage)/drawRect.size.height));
layer.contentsScale = scale;
Почему вы устанавливаете '[self setLayer: [CALayer layer]]'? – yurish
Нет веской причины. Я удалил его. –
Попробуйте установить CALayer.contentsScale на [UIScreen mainScreen] .scale – yurish