Câu trả lời:
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
hoặc là
NSData *imageData = UIImagePNGRepresentation(image);
Tùy thuộc vào việc bạn muốn dữ liệu của mình ở định dạng PNG hay JPG.
Khi khởi tạo một UIImage
đối tượng bằng init(data: originalData)
, đối tượng đó originalData
sẽ được chuyển đổi thành dữ liệu thô ở một số loại định dạng nội bộ. Những dữ liệu này có thể được truy xuất sau đó với
let rawData = myImage.cgImage?.dataProvider?.data as Data?
Tuy nhiên, vì rawData
là thô, nó sẽ còn lớn hơn khi sử dụng UIImagePNGRepresentation
.
Bạn có thể mong đợi rằng UIImage là một đối tượng được định dạng để hiển thị và do đó, sẽ không sử dụng dữ liệu gốc (có thể ở định dạng PNG hoặc JPEG) mà có nhiều khả năng là một 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
.
Nếu bạn chỉ muốn sử dụng nó ở nơi khác trong chương trình của mình, UIImage ban đầu sẽ hoạt động tốt (tôi cho rằng điều đó không thực sự xảy ra ở đây)
Nếu bạn muốn nối tiếp, UIImagePNGRepresentation(...)
sẽ hoạt động nhưng sẽ 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 mất mát nếu bản gốc của bạn là PNG. Bạn có thể chọn một cái dựa trên cách hiển thị hình ảnh và định dạng bạn muốn được cung cấp. Nếu bạn đang sử dụng PNG trong và muốn PNG ra, bạn nên có kích thước tệp tốt và dữ liệu gần như giống hệt nhau, bỏ các phần PNG đặc biệt.
Nếu bạn muốn nhận một bản sao chính xác của dữ liệu gốc (có thể để lưu tệp sau khi tạo hình thu nhỏ hoặc để SHA1 tệp đó), thì bạn cần giữ lại tệp đó một cách riêng biệt. Bạn có thể làm điều gì đó như:
var image:UIImage
var imageData:NSData {
didSet {
image = UIImage(data: imageData)
}
}
Swift 4.2
let dataPng = image.pngData() // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format
let dataJpg = image.jpegData(compressionQuality: 1) // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)
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 thuộc tính CIImage .
CIImage
chỉ được đặt nếu nó được khởi tạo bằng imageWithCIImage:
. Ngoài ra, đây không trực tiếp là dữ liệu được sử dụng mà là một đối tượng đại diện hình ảnh khác.
UIImageJPEGRepresentation
hoặcUIImagePNGRepresentation
sẽ thay đổi dữ liệu và thực hiện chuyển đổi lại. Có cách nào để thực sự đạt được những gì đã yêu cầu không?