2013-04-16 42 views
11

Tôi muốn cho phép người dùng chọn ảnh mà không giới hạn kích thước, sau đó chỉnh sửa ảnh.Xử lý ảnh lớn trong iOS

Ý tưởng của tôi là tạo hình thu nhỏ của ảnh lớn có cùng kích thước với màn hình để chỉnh sửa và sau đó, khi chỉnh sửa xong, hãy sử dụng ảnh lớn để thực hiện chỉnh sửa tương tự đã được thực hiện trên hình thu nhỏ.

Khi tôi sử dụng UIGraphicsBeginImageContext để tạo hình thu nhỏ, nó sẽ gây ra vấn đề về bộ nhớ.

Tôi biết rất khó chỉnh sửa toàn bộ hình ảnh lớn trực tiếp do giới hạn phần cứng, vì vậy tôi muốn biết liệu có cách nào tôi có thể downsample hình ảnh lớn xuống ít hơn 2048 * 2048 vấn đề bộ nhớ không?

Tôi thấy rằng có một lớp BitmapFactory có tùy chọn inSampleSize có thể làm giảm ảnh trong nền tảng Android. Làm thế nào điều này có thể được thực hiện trên iOS?

+0

Bạn có thể sử dụng dữ liệu NSData * = [Dữ liệu NSDataWithContentsOfFile: tùy chọn đường dẫn: Lỗi NSDataReadingMappedAlways: & error]; Để truy cập vào dữ liệu hình ảnh mà không cần tải nó vào bộ nhớ. – Sten

+0

nhờ mẹo của Sten, tôi đã thử sử dụng tùy chọn NSDataReadingMappedAlways, nhưng nó vẫn gặp sự cố với hình ảnh 10000 * 10000, tôi nghĩ dù tải hình ảnh như thế nào, hãy sử dụng UIGraphicsBeginImageContext để chia tỷ lệ hình ảnh gốc cần toàn bộ bitmap trong bộ nhớ. Có cách nào tôi có thể downsample hình ảnh khi tải tập tin jpeg/png vào bộ nhớ? – lingtianlan

Trả lời

8

Bạn cần phải xử lý hình ảnh tải sử dụng UIImage mà không thực sự tải hình ảnh vào bộ nhớ và sau đó tạo ra một bối cảnh bitmap ở kích thước của hình ảnh kết quả mà bạn muốn (vì vậy đây sẽ là lượng bộ nhớ được sử dụng). Sau đó, bạn cần phải lặp lại một số lần vẽ các ô từ hình ảnh gốc (đây là nơi các phần của dữ liệu hình ảnh được tải vào bộ nhớ) bằng cách sử dụng CGImageCreateWithImageInRect vào ngữ cảnh đích bằng cách sử dụng CGContextDrawImage.

Xem this sample code from Apple.

+0

Tuyệt vời, nó không thể có được thẩm quyền hơn một ví dụ mã từ Apple đó là chính xác về chủ đề này! – DarkDust

0

Hãy xem tác phẩm này của Trevor Harmon. Nó cải thiện hiệu suất của ứng dụng của tôi.Tôi tin rằng nó sẽ làm việc cho bạn quá.

https://github.com/coryalder/UIImage_Resize

+0

Vì điều này đang hoạt động trên UIImage đã có trong bộ nhớ, làm cách nào để tránh các vấn đề về bộ nhớ? – DarkDust

1

Hình ảnh lớn không vừa với bộ nhớ. Vì vậy, tải chúng vào bộ nhớ để sau đó thay đổi kích thước chúng không hoạt động.

Để làm việc với những hình ảnh rất lớn, bạn phải xếp chúng. Rất nhiều giải pháp trên mạng đã ví dụ xem nếu điều này có thể giải quyết vấn đề của bạn:

https://github.com/dhoerl/PhotoScrollerNetwork

tôi thực hiện giải pháp tùy chỉnh của riêng tôi nhưng đó là đặc trưng cho môi trường của chúng tôi, nơi chúng tôi đã có một phía máy chủ chạy hình ảnh thợ lợp nhà đã & tôi chỉ có thể yêu cầu các lát hình ảnh lớn cụ thể (máy chủ madea, nó thực sự tuyệt)

Lý do các công việc ốp lát là về cơ bản bạn chỉ giữ các pixel hiển thị trong bộ nhớ, và không có nhiều pixel đó. Tất cả các lát gạch hiện không hiển thị đều được tính đến bộ nhớ cache của đĩa hoặc bộ nhớ cache flash như trước đây.

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