2011-01-16 35 views
29

Tôi đang sử dụng đoạn mã sau để thực hiện một số thao tác trên hình ảnh mà tôi nạp, nhưng tôi thấy rằng màn hình trở nên mờ khi nó là trên màn hình võng mạcCoreGraphics để hiển thị võng mạc

- (UIImage*)createImageSection:(UIImage*)image section:(CGRect)section 

{ 
float originalWidth = image.size.width ; 
float originalHeight = image.size.height ; 
int w = originalWidth * section.size.width; 
int h = originalHeight * section.size.height; 

CGContextRef ctx = CGBitmapContextCreate(nil, w, h, 8, w * 8,CGImageGetColorSpace([image CGImage]), kCGImageAlphaPremultipliedLast); 
CGContextClearRect(ctx, CGRectMake(0, 0, originalWidth * section.size.width, originalHeight * section.size.height)); // w + h before 
CGContextTranslateCTM(ctx, (float)-originalWidth * section.origin.x, (float)-originalHeight * section.origin.y); 
CGContextDrawImage(ctx, CGRectMake(0, 0, originalWidth, originalHeight), [image CGImage]); 
CGImageRef cgImage = CGBitmapContextCreateImage(ctx); 
UIImage* resultImage = [[UIImage alloc] initWithCGImage:cgImage]; 

CGContextRelease(ctx); 
CGImageRelease(cgImage); 

return resultImage; 
} 

Làm thế nào để thay đổi điều này để làm cho nó tương thích với võng mạc.

Cảm ơn trước sự giúp đỡ của bạn

nhất, DV

Trả lời

47

CGImages không đưa vào tài khoản các Retina-Ness của thiết bị của bạn, vì vậy bạn phải làm như vậy chính mình. Để thực hiện điều đó, bạn cần nhân tất cả tọa độ và kích thước sử dụng trong các thường trình CoreGraphics bởi thuộc tính scale của hình ảnh đầu vào (sẽ là 2.0 trên thiết bị Retina), để đảm bảo bạn thực hiện tất cả thao tác ở độ phân giải kép.

Sau đó, bạn cần thay đổi khởi tạo resultImage để sử dụng initWithCGImage:scale:orientation: và nhập cùng hệ số tỷ lệ. Đây là những gì làm cho thiết bị Retina hiển thị đầu ra ở độ phân giải gốc hơn là độ phân giải gấp đôi pixel.

+0

Cảm ơn! Phương pháp này đã giải quyết được vấn đề của tôi !! – DKV

+1

Nếu bạn thay đổi CTM (ma trận biến đổi hiện tại) trong ngữ cảnh của bạn bằng cách gọi 'CGContextScaleCTM (UIGraphicsGetCurrentContext(), 2, 2)', bạn không cần phải nhân các tọa độ của mình theo cách thủ công, bạn có thể vẽ giống như bạn làm với hình ảnh không võng mạc. – epologee

+14

Xin lỗi, quá nhanh với nhận xét và quá muộn để chỉnh sửa. Nếu bạn làm như thế này, bạn không cần phải tự mình cân nhắc tất cả các tọa độ: thang đo 'CGFloat scale = [[UIScreen mainScreen]]; CGContextScaleCTM (UIGraphicsGetCurrentContext(), tỷ lệ, tỷ lệ); ' – epologee

5

Cảm ơn câu trả lời đã giúp tôi! Dù sao để được rõ ràng hơn, mã bởi OP nên được thay đổi như thế này:

- (UIImage*)createImageSection:(UIImage*)image section:(CGRect)section   
{ 
    CGFloat scale = [[UIScreen mainScreen] scale]; ////// ADD 

    float originalWidth = image.size.width ; 
    float originalHeight = image.size.height ; 
    int w = originalWidth * section.size.width *scale; ////// CHANGE 
    int h = originalHeight * section.size.height *scale; ////// CHANGE 

    CGContextRef ctx = CGBitmapContextCreate(nil, w, h, 8, w * 8,CGImageGetColorSpace([image CGImage]), kCGImageAlphaPremultipliedLast); 
    CGContextClearRect(ctx, CGRectMake(0, 0, originalWidth * section.size.width, originalHeight * section.size.height)); // w + h before 
    CGContextTranslateCTM(ctx, (float)-originalWidth * section.origin.x, (float)-originalHeight * section.origin.y); 

    CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale); ////// ADD 

    CGContextDrawImage(ctx, CGRectMake(0, 0, originalWidth, originalHeight), [image CGImage]); 
    CGImageRef cgImage = CGBitmapContextCreateImage(ctx); 
    UIImage* resultImage = [[UIImage alloc] initWithCGImage:cgImage]; 

    CGContextRelease(ctx); 
    CGImageRelease(cgImage); 

    return resultImage; 
} 
2

Swift phiên bản:

let scale = UIScreen.mainScreen().scale 

    CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale) 
Các vấn đề liên quan