2012-02-25 21 views
11

Tôi cần vẽ hình ảnh vào một CALayer vì tôi cần phải thực hiện các hiệu ứng, hình động và bộ lọc khác nhau trên đó. Khi tôi vẽ bản vẽ đơn giản vào CGContext bất kể tôi làm gì thì nó luôn được vẽ theo pixel ... Cách thích hợp để vẽ lên một bối cảnh trong võng mạc là gì?CGContextDrawImage trong Retina vẽ hình ảnh được pixelated?

Đây là những gì tôi đang làm bây giờ:

CGImageRef plateImage = [[UIImage imageNamed:@"someImage"] CGImage]; 
CGFloat width = CGImageGetWidth(plateImage), height = CGImageGetHeight(plateImage); 
CGFloat scale = [[UIScreen mainScreen] scale]; 

NSLog(@"Scale: %f\nWidth: %f\nHeight: %f", scale, width, height); 
CGContextTranslateCTM(_context, 0, height/scale); 
CGContextScaleCTM(_context, 1.0, -1.0); 

CGContextDrawImage(_context, CGRectMake(0, 0, width/scale, height/scale), plateImage); 

Trả lời

18

Bạn cần phải thiết lập các nội dung quy mô của lớp một cách thích hợp.

myLayer.contentsScale = [UIScreen mainScreen].scale 
+0

Aaaaaa! Tôi đã tìm kiếm ở khắp mọi nơi trong tài liệu CG - không nghĩ trong một phút nó là một vấn đề lớp! Cảm ơn bạn! – shein

+0

Tuyệt vời. Cảm ơn bạn. – darkheartfelt

23

Tôi gặp vấn đề tương tự nhưng giải pháp dường như không hoạt động.

UIGraphicsBeginImageContext() hóa ra là nguyên nhân của tôi. Tôi đang đăng giải pháp của mình ở đây cho những người dùng tương lai có cùng vấn đề.

Từ iOS 4.0 bạn nên sử dụng:

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); 

thay vì

UIGraphicsBeginImageContext(size); 

Nếu bạn không muốn hình ảnh pixelated.

+0

Cảm ơn bạn! Tôi không thể nói rằng tôi hiểu lý do tại sao điều này hoạt động, nhưng nó có. – anonymouse

+2

Đây sẽ là câu trả lời đúng! – Fydo

+2

Đáng chú ý là tôi có kết quả tốt nhất khi kết hợp với câu trả lời được chấp nhận: 'UIGraphicsBeginImageContextWithOptions (imageSize, NO, [UIScreen mainScreen] .scale);' – bplattenburg

Các vấn đề liên quan