2012-07-25 37 views
9

Tôi có một hình ảnh lớn quá lớn để được tải vào bộ nhớ nhưng tôi chỉ quan tâm đến một tập hợp các pixel trong hình ảnh lớn đó. Có thể giải mã vào bộ nhớ chỉ tập hợp con pixel này không? Tôi biết rằng trong Android có một lớp trong API để thực hiện chính xác này được gọi là BitmapRegionDecoder là một cái gì đó như thếios Giải mã một phần của hình ảnh

tôi thấy CGDataProviderCreateSequential nhưng nó cần các điểm ảnh thô trong các nhà xây dựng ...

Ngay bây giờ tôi đang làm một cái gì đó như thế này:

UIImage* srcImage = ...; 
    CFDataRef cgImgDataRef = CGDataProviderCopyData(CGImageGetDataProvider(srcImage.CGImage));//After this call, all pixels are decoded into memory and the app crashes 
char* imageData = (char*)CFDataGetBytePtr(cgImgDataRef); 
+0

Sự khôn ngoan hiện tại nói rằng cách để làm điều này là cắt hình ảnh của bạn thành các ô và chỉ tải nhẹ các ô hiện đang được hiển thị ở mức thu phóng thích hợp. Chính xác hình ảnh này lớn đến cỡ nào (theo kích thước pixel)? – warrenm

+0

khoảng 4096x3072 nhưng điều là tôi muốn tải một lát hình ảnh lớn trực tiếp vào ứng dụng gl ES mở của tôi. Vì vậy, tôi cần phải trích xuất các pixel cần thiết và gọi glTexImage2D (...) với dữ liệu pixel phụ của tôi – AkademiksQc

+0

Kích thước của ảnh con bạn đang trích xuất luôn giống nhau hay biến đổi? Phạm vi là gì? – warrenm

Trả lời

10

cách duy nhất có thể này có thể làm việc là nếu bạn tạo một CGImageSourceCreateWithData() (hoặc URL bất cứ điều gì), sau đó tạo ra một CGImageRef sử dụng CGImageCreateWithJPEGDataProvider hoặc CGImageCreateWithPNGDataProvider. Với số CGImageRef, bạn có thể CẦN sử dụng CGImageCreateWithImageInRect() và kéo một phần của hình ảnh lớn ra.

Nếu những gì bạn đang cố gắng làm là xếp hình ảnh, hãy làm rõ câu hỏi của bạn vì tôi sẽ có thêm thông tin cho bạn.

+0

wow nó thực sự hoạt động! Trước đây tôi đã tải dữ liệu jpeg bằng cách sử dụng [UIImage imageNamed ...]. Có vẻ như CGImageCreateWithJPEGDataProvider + CGImageCreateWithImageInRect() chỉ giải mã phần cần thiết. Trước khi nó luôn luôn bị hỏng do bộ nhớ thấp bây giờ nó hoạt động. Tôi sẽ kiểm tra tài liệu để xem có giải thích thêm về các phương pháp đó hay không. Đối với thông tin của bạn, mục tiêu là để tải hình ảnh lớn từ đĩa và gửi nó để opengl. Tôi cần phải gạch nó tùy thuộc vào kích thước kết cấu opengl tối đa được hỗ trợ trên thiết bị – AkademiksQc

+0

Đối với các tệp JPEG thực sự lớn, bạn có thể sử dụng libjpeg-turbo và thư viện tự do nguồn mở có sử dụng NEON để tăng tốc armv7. Tôi sử dụng nó trong dự án PhotoScrollerNetwork của tôi để lát và hiển thị hình ảnh của NASA 18000x18000 trên điện thoại! –

+0

ok tôi sẽ xem xét nó ... nhưng nó không phải là giải mã phần mềm mà thôi sao? Tôi nghĩ rằng tôi đã phải sử dụng ios SDK cho bộ giải mã phần cứng jpeg tích hợp – AkademiksQc

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