2010-07-20 36 views
50

Tôi cần phải khởi tạo hình ảnh từ dữ liệu thô được tải xuống từ máy chủ cung cấp kích thước hình ảnh chính xác dựa trên loại ứng dụng khách iPhone.Hiển thị võng mạc và [UIImage initWithData]

Tôi biết rằng tôi nên đặt giá trị tỷ lệ là 2.0 trên màn hình 640x960, tuy nhiên đây là thuộc tính chỉ đọc và không thể được đặt trong init khi sử dụng initWithData.

Bất kỳ ý tưởng nào?

+3

Tôi có thể đề xuất thay đổi tiêu đề câu hỏi thành "Cách thay đổi thuộc tính quy mô của UIImage" để giúp tìm kiếm dễ dàng hơn không? – Rivera

+1

Wow, tôi đã hỏi câu hỏi này cách đây hơn 4 năm. Tôi nghĩ tôi sẽ để nó, cảm ơn. – Sam

Trả lời

93

Tôi không biết bất cứ điều gì bạn có thể nhúng vào các dữ liệu hình ảnh riêng của mình để nói với điện thoại rằng đó là một hình ảnh @ 2x, nhưng một cái gì đó như thế này nên làm việc:

UIImage * img = ...; 
img = [UIImage imageWithCGImage:img.CGImage scale:2 orientation:img.imageOrientation]; 
+0

Điều này cũng đã sửa nó cho tôi, cảm ơn! Tôi đã vẽ văn bản trên một hình ảnh và cần điều này để giữ cho quy mô chính xác trên hình ảnh kết quả. – Jason

+0

Perfekt cho tôi quá ... Nhưng tại sao chúng ta phải thực hiện các công cụ cấp thấp như vậy nếu chúng ta lưu trữ một hình ảnh với UIImagePNGrepresentation và muốn nó trở lại chính xác? Đó không phải là giống Apple. \t \t \t CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData ((CFDataRef) ); \t \t \t CGImageRef cgHeaderImage = CGImageCreateWithPNGDataProvider (dataProvider, NULL, NO, kCGRenderingIntentDefault); \t \t \t CGDataProviderRelease (dataProvider); \t \t \t tiêu đềCell.headerImage.image = [UIImage imageWithCGImage: cgHeaderMức hình ảnh: 2.0 hướng: UIImageOrientationUp]; CGImageRelease (cgHeaderImage); – Gerd

+0

Do PNGRepresentation không có khái niệm về "scale" (tương tự, JPEGRepresentation không có khái niệm về độ trong suốt); hình ảnh đơn giản được tải bởi CGImage. Mặc dù trong lý thuyết bạn có thể sử dụng hình ảnh DPI, tôi khá chắc chắn rằng CGImage chỉ đơn giản là bỏ qua thông tin DPI, vì vậy UIImage sẽ phải làm phân tích cú pháp bổ sung.Ngoài ra, thông tin DPI là * hầu như luôn vô nghĩa *: Mac mặc định là 72, Windows mặc định là 96 và hầu hết các máy ảnh kỹ thuật số mặc định là 300 (và "DPI" của ảnh là hoàn toàn vô nghĩa, tôi muốn độ phân giải góc/FOV và biến dạng ống kính đường cong). –

-4

AFAIK bạn không cần tự đặt giá trị tỷ lệ. Hệ điều hành sẽ xử lý các điểm để dịch pixel cho bạn.

+0

Nếu tôi chỉ khởi tạo một UIImage từ dữ liệu, nó được nâng cấp trên iPhone 4. (ví dụ, một hình ảnh 320x480 sẽ là toàn màn hình trên iPhone 4). Tôi cần phải ngăn chặn điều này bằng cách nào đó để tôi có thể sử dụng hình ảnh có độ phân giải cao – Sam

+0

Ah ok không biết điều đó, cảm ơn! – Rengers

+2

Chỉ khi một hình ảnh có hậu tố @ 2x không thể thực hiện được khi bạn 'initWithData' –

18

Kể từ iOS 6.0 UIImage có phương pháp + imageWithData:scale:, bạn có thể vượt qua 2.0 làm tỷ lệ cho võng mạc.

7

Bạn có thể vượt qua [[UIScreen mainScreen] scale] làm thông số tỷ lệ thay vì 2.0f.

-1

đặt này trong .m của bạn nếu bạn muốn hoặc trên một lớp nhập khẩu (cú pháp của c là đẹp hơn khi gọi hàm IMAO)

BOOL isRetina(){ 
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
     return [[UIScreen mainScreen] scale] == 2.0; 
    } 
    return NO; 
} 

Sau đó, khi tạo hình ảnh với dữ liệu máy chủ:

[UIImage imageWithData:dataFromServer scale:isRetina()?2:1]; 
+2

Tại sao không chỉ gọi '[UIImage imageWithData: dataFromServer scale: [UIScreen mainScreen] .scale]'? –

+1

Điều này sẽ phá vỡ cho iPhone 6+. –

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