2012-01-02 26 views
5

Tôi có mã để tạo lại hình ảnh chất lượng cao với chất lượng rất kém nhưng tôi hơi bối rối bởi kết quả tôi thấy. Mã này là ở đây:Làm cách nào để tạo lại UIImage với mức nén thấp hơn trong iOS?

NSData *compressedData = UIImageJPEGRepresentation(bigImage,0); 
NSLog(@"compressedData length = %d", [compressedData length]); 
self.currentImage = [UIImage imageWithData:compressedData]; 
NSData *dataAfterCompression = UIImageJPEGRepresentation(self.currentImage,1); 
NSLog(@"dataAfterCompression length = %d", [dataAfterCompression length]); 

kết quả đầu ra nào:

2012-01-02 02:47:05.615 MyApp[349:707] compressedData length = 32671 
2012-01-02 02:47:06.143 MyApp[349:707] dataAfterCompression length = 251144 

Tại sao sẽ tạo ra một hình ảnh mới với các dữ liệu chất lượng thấp dẫn đến một hình ảnh lớn như vậy?

Trả lời

-1

Xin lỗi lời nói của tôi nhưng bạn ít Confused đây

Ở đây bạn đang đi qua 0.0 có nghĩa là tối đa nén và chất lượng thấp hơn

NSData * compressedData = UIImageJPEGRepresentation (bigImage, 0);

NSLog (@ "compressedData length =% d", [compressedData length]);

self.currentImage = [UIImage imageWithData: compressedData];

* Ở đây bạn đang đi qua 1 nghĩa là tối đa nén và chất lượng thấp hơn *

NSData * dataAfterCompression = UIImageJPEGRepresentation (self.currentImage, 1);

NSLog (@ "dataAfterCompression length =% d", [dataAfterCompression length]);

/* NSData * UIImageJPEGĐại diện ( Hình ảnh UIImage *, CGKhắc nénQuality ); */

0.0 có nghĩa là nén tối đa và chất lượng thấp hơn

1 có nghĩa là nén tối thiểu và chất lượng cao

+0

Tôi đang sử dụng chất lượng cao nhất lần thứ hai chỉ để lấy đối tượng NSData để ghi nhật ký kích thước. Nhưng hình ảnh tôi đang sử dụng quy mô chất lượng cao nhất nên đã được thu nhỏ lại với chất lượng thấp nhất, vì vậy tôi nghĩ tôi sẽ nhận được hình ảnh 32.6KB – Tony

+0

Nếu bạn muốn có hình ảnh có kích thước xấp xỉ 32 KB. sau đó bạn phải sử dụng nén tối đa hơn là nén thấp hơn. Vì vậy, nó thuộc vào bạn. Bên cạnh đó bạn sẽ thấy liên kết này, tôi hy vọng nó có thể khá hữu ích cho bạn http://ofcodeandmen.poltras.com/2008/10/ 30/undocumented-uiimage-resizing/ – Kamarshad

+0

Tôi đã làm. Đọc lại câu hỏi của tôi một cách cẩn thận – Tony

8

Đầu vào UIImageJPEGRepresentation là một mảng 2-D của pixel, không phải là dữ liệu nén từ mà mảng 2-D đã được tạo. (Mảng có thể không đến từ dữ liệu nén!) UIImageJPEGRepresentation không biết gì về hình ảnh đến từ đâu, và nó không có khái niệm về chất lượng của đầu vào. Nó chỉ biết rằng bạn muốn nó cố gắng rất khó để làm cho đầu ra nhỏ (khi compressionQuality là số không) hoặc bạn muốn nó cố gắng hết sức để làm cho đầu ra chính xác (khi compressionQuality là một).

Thuật toán nén JPEG có một số thông số có thể điều chỉnh. Giá trị compressionQuality chọn một tập hợp các tham số đó. Khi bạn đặt compressionQuality thành 1, máy nén sẽ sử dụng một bộ tham số cho phép mất rất ít độ chính xác của dữ liệu đầu vào, bất kể dữ liệu đầu vào thực sự là gì. Đối với bất kỳ dữ liệu đầu vào nào, các thông số đó dẫn đến mất rất ít độ chính xác. Sự cân bằng là những thông số đó cũng dẫn đến việc nén rất ít. Các máy nén không sau đó nghĩ rằng "Hmm, tôi nên thử sử dụng các thông số khác và xem nếu tôi nhận được cùng một độ chính xác với nén tốt hơn". Nếu đó là những gì bạn muốn, bạn phải tự mình làm.

+0

Dữ liệu nhập vào UIImageJPEGĐại diện là UIImage, không phải là mảng pixel 2-D. Câu hỏi của tôi thực sự hỏi làm thế nào xây dựng một UIImage với 32671 byte dữ liệu có thể dẫn đến một UIImage kích thước của 251144 byte. Tôi đoán đó là vì việc tạo UIImage giải nén dữ liệu và mở rộng nó để điền vào toàn bộ UIImage (mặc dù tôi nghĩ nó sẽ cần một frane để làm điều này) và việc nén dữ liệu hình ảnh thực sự không tiết kiệm được nhiều không gian. Tôi đang tìm kiếm một mô tả kỹ thuật hơn về lý do tại sao điều này xảy ra. – Tony

+0

JPEG là một thuật toán để nén mảng pixel 2-D. Vì vậy, khi bạn gọi 'UIImageJPEGRepresentation', nó sẽ hỏi' UIImage' cho mảng pixel 2-D của nó và hoạt động trên đó. –

+0

Có lẽ câu hỏi của tôi là khó hiểu nhưng điều này thực sự không trả lời câu hỏi của tôi cả. Rõ ràng là phương pháp sẽ yêu cầu dữ liệu pixel. Đó không phải là đầu vào cho phương pháp nhưng chắc chắn, để nén dữ liệu hình ảnh, nó sẽ yêu cầu dữ liệu :) – Tony

1

Tôi không chắc chắn nếu điều này là chính xác những gì bạn đang tìm kiếm, nhưng blog này có một số lớp mở rộng UIImage và nó đề với nén khá tốt đẹp. Kiểm tra trang web này: http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

+0

Làm cách nào để xử lý nén "khá đẹp"? Xin lỗi, tôi chỉ thấy mã thay đổi kích thước hình ảnh ở đó – Tony

+0

Trong các lớp có tiêu đề UIImage + NSCoding, có một số mã liên quan đến định dạng mã hóa và chất lượng, mặc dù nó có thể giúp chỉ đúng hướng về nén, nhưng có lẽ tôi hiểu nhầm vấn đề – tams

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