Intereting Posts
Включение и отключение прокрутки UITableview на основе перемещения ячейки UITableview при перетаскивании сохранить счетчик контроллера просмотра, не равный нулю после сообщения о выпуске Код EXC_BREAKPOINT = 1 в _CFRunLoopServiceMachPort лучший способ получить название дня на ios swift Добавление Pollfish и PrintIO в одно приложение, имеющее выпускную публикацию Удалить верхнее / нижнее тени из UIWebView? Передача данных из представлений в основных данных Можно ли изменить значок приложения в зависимости от рынка? CoreData один-ко-многим, используя только один объект Как заменить асинхронные вызовы с помощью mocks и предопределенных ответов? Как отредактировать рамку видео, отредактировать этот конкретный кадр и заменить его фактическим кадром в видео? Пользовательский компонентный фон прозрачный Доступ к UIPopoverController из UIActionSheet удалить Cache из файлов не удалось Делегаты URLSession, не вызванные после проверки подлинности

CGContextDrawImage рисует большие изображения, очень размытые

Я пытаюсь создать объект, который может нарисовать часть большого (скажем, 2048 x 1537) изображений с использованием CGContextDrawImage (…). Он работает просто отлично, за исключением того, что он чрезвычайно размыт. Я использую «drawingController», который переопределяет drawLayer: inContext: вроде этого

-(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; 

Я не знаю точно для osx, но я могу дать вам несколько советов.

  • Проверьте свойство contentScale как указано в commets, я написал также вопрос об этом, но у меня никогда не было реального ответа
  • В большинстве случаев размытость связана с отключением пикселя, это требует, чтобы система применяла сглаживание на изображении, я вижу, что вы установили contentRect, это с помощью contentGravity, возможно, изменило бы пропорцию и масштабирование изображения, превратив его в размытие , Вот хороший ответ .
  • Каков ваш контент?
  • Вначале попробуйте, просто вам нужно рисовать async?

Надеюсь это поможет.