2011-01-07 30 views
91

Tôi có thể tạo UIImage từ NSData bằng cách sử dụng phương thức [UIImage imageWithdata:] hoặc [UIImage initWithData].Lấy NSData cơ bản * từ UIImage

Tôi tự hỏi liệu tôi có thể lấy lại NSData * từ một UIImage hiện có * không?
nội dung nào đó trên dòng NSData* myData = [myImage getData];

Điều này là không thể?
Cảm ơn bạn

Trả lời

173
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality 

hoặc

NSData *imageData = UIImagePNGRepresentation(image); 

Tùy thuộc nếu bạn muốn dữ liệu của bạn ở định dạng PNG hoặc định dạng JPG.

+62

Tôi không biết tại sao câu trả lời này được bỏ phiếu nhiều lần và cũng không được chấp nhận. OP yêu cầu truy xuất dữ liệu ban đầu.Sử dụng 'UIImageJPEGRepresentation' hoặc' UIImagePNGRepresentation' ** sẽ ** thay đổi dữ liệu và thực hiện việc đảo ngược. Có cách nào để thực sự đạt được những gì được yêu cầu không? – CipherCom

+5

Câu trả lời này là không tốt, bởi vì nó sẽ làm giảm chất lượng của hình ảnh nếu nó đã ở định dạng bị mất. – 1dayitwillmake

+0

@CipherCom Tôi thấy những gì bạn đang nói về việc muốn dữ liệu chính xác trở lại. Tuy nhiên, tôi nghĩ rằng đối với phần lớn những người mà đi qua câu hỏi, câu trả lời này sẽ được hoàn hảo cho nhu cầu của họ ... do đó các upvotes. Nếu bạn gặp câu trả lời để lấy lại dữ liệu ban đầu, vui lòng chia sẻ;) – tybro0103

-2

Mọi thứ đã thay đổi kể từ khi câu trả lời ở trên được đưa ra, đối với những người vẫn đang tìm kiếm vì họ chia sẻ mối quan tâm của CipherCom: iOS 5 đã thêm CIImage property.

+0

Tôi không thấy cách sử dụng CIImage để lấy NSData cơ bản ... Tôi có thiếu thứ gì đó không? – tybro0103

+4

Điều này sẽ không hữu ích. Thuộc tính '' CIImage'' chỉ được thiết lập nếu nó được khởi tạo với '' imageWithCIImage: ''. Ngoài ra, đây không phải là dữ liệu được sử dụng trực tiếp mà là một đối tượng đại diện hình ảnh khác. – CipherCom

3

Chỉ vì tôi stumbled khi này và tôi muốn nhanh chóng :)

Dưới đây là bản dịch nhanh chóng các bài Caroiline của.

var imageData = UIImagePNGRepresentation(image) 

Hoặc

var imageData = UIImageJPEGRepresentation(image, 0.7) 
+0

Câu hỏi không phải là nhanh chóng. –

4

Bạn có thể mong đợi rằng một UIImage là một đối tượng được định dạng để trưng bày và như vậy sẽ không được sử dụng các dữ liệu ban đầu (mà có lẽ ở định dạng PNG hoặc JPEG) nhưng nhiều khả năng mảng pixel hoặc một số định dạng nội bộ khác. Nói cách khác, UIImage(data: foo) sẽ không giữ lại foo.

  1. Nếu bạn chỉ muốn sử dụng nó ở nơi khác trong chương trình của bạn, UIImage gốc sẽ làm tốt (tôi đoán đó không phải thực sự là trường hợp ở đây)

  2. Nếu bạn muốn serialise, UIImagePNGRepresentation(...) sẽ làm việc nhưng sẽ được quá khổ nếu bản gốc là JPEG; UIImageJPEGRepresentation(...) thường sẽ dẫn đến dữ liệu hơi quá khổ và hơi bị mất nếu bản gốc của bạn là PNG. Bạn nên chọn một hình ảnh dựa trên cách hình ảnh sẽ được hiển thị và định dạng bạn mong muốn được cung cấp. Nếu bạn đang sử dụng PNG và muốn PNG ra, bạn sẽ nhận được một kích thước tập tin tốt và dữ liệu gần như giống hệt nhau, các đoạn PNG đặc biệt sang một bên.

  3. Nếu bạn muốn nhận được một bản sao chính xác của dữ liệu gốc (có lẽ để lưu tệp sau khi thu nhỏ hoặc sang SHA1), thì bạn cần giữ riêng nó. Bạn có thể làm điều gì đó như:

    var image:UIImage 
    var imageData:NSData { 
        didSet { 
         image = UIImage(data: imageData) 
        } 
    } 
    
0

Khi initialising một đối tượng UIImage với init(data: originalData), mà originalData sẽ được chuyển đổi thành dữ liệu thô trong một số loại định dạng nội bộ. Những dữ liệu này có thể được lấy ra sau đó với

let rawData = myImage.cgImage?.dataProvider?.data as Data? 

Tuy nhiên vì rawData là thô, nó sẽ là lớn hơn so với khi sử dụng UIImagePNGRepresentation.

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