Nhận NSData cơ bản từ UIImage


104

Tôi có thể tạo UIImagetừ NSDatasử dụng [UIImage imageWithData:]hoặc [UIImage initWithData:]các phương pháp.

Tôi tự hỏi nếu tôi có thể lấy NSDatalại từ một hiện có UIImage? Một cái gì đó trên dòng củaNSData *myData = [myImage getData];

Câu trả lời:


191
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.


82
Tôi không biết tại sao câu trả lời này được bình chọn nhiều lần và nó cũng không được chấp nhận. OP yêu cầu truy xuất dữ liệu đã được cung cấp ban đầu. Sử dụng UIImageJPEGRepresentationhoặc UIImagePNGRepresentation 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?
Patrik

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

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

@ 1dayitwillmake Ngay cả đại diện PNG? Không phải lĩnh vực chuyên môn của tôi, nhưng tôi nghĩ rằng PNG không bị lỗ?
tybro0103 Ngày

@Bob Spryn Điều này sẽ không hữu ích. Thuộc tính 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.
King-Wizard

21

Khi khởi tạo một UIImageđối tượng bằng init(data: originalData), đối tượng đó originalDatasẽ đượ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ì rawDatalà thô, nó sẽ còn lớn hơn khi sử dụng UIImagePNGRepresentation.


làm thế nào để làm điều này trong Objective-C
h3dkandi

NSData * rawData = (__bridge NSData *) CGDataProviderCopyData (CGImageGetDataProvider (image.CGImage));
ZardozSpeaks

@ZardozNói biến thể obj-c hoàn toàn có thể được đưa vào dưới dạng chỉnh sửa trong câu trả lời này.
Kamil.S

6

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.

  1. 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)

  2. 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.

  3. 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)
        }
    }

4

Chỉ vì tôi tình cờ gặp phải điều này và tôi thích nhanh chóng :)

Đây là bản dịch nhanh bài đăng của Caroiline.

var imageData = UIImagePNGRepresentation(image)

Hoặc là

var imageData = UIImageJPEGRepresentation(image, 0.7) 

Câu hỏi không phải về nhanh chóng.
Cross_

3

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)

-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 thuộc tính CIImage .


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 giúp ích gì. Thuộc tính CIImagechỉ đượ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.
Patrik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.