แปลง UIImage เป็น NSData


170

ฉันใช้รหัสนี้ในแอพของฉันซึ่งจะช่วยให้ฉันส่งภาพได้

อย่างไรก็ตามฉันมีมุมมองภาพพร้อมรูปภาพ ฉันไม่มีไฟล์ใน appbundle แต่มีภาพอยู่ข้างๆ ฉันจะเปลี่ยนรหัสด้านล่างได้อย่างไร ใครช่วยบอกฉันฉันจะแปลงmyimageเป็นNSDataอย่างไร

// Attach an image to the email
NSString *path = [[NSBundle mainBundle] pathForResource:@"rainy" ofType:@"jpg"];
NSData *myData = [NSData dataWithContentsOfFile:path];
[picker addAttachmentData:myData mimeType:@"image/jpeg" fileName:@"rainy"];

2
UIImageJPEG นำเสนอ, UIImagePNGR การนำเสนอผลตอบแทนทั้ง nsdata ของภาพ .....
Himanshu Agnihotri

คำตอบ:


286

ลองทำอย่างใดอย่างหนึ่งต่อไปนี้ขึ้นอยู่กับรูปแบบภาพของคุณ:

UIImageJPEGRepresentation

ส่งคืนข้อมูลสำหรับภาพที่ระบุในรูปแบบ JPEG

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

UIImagePNGRepresentation

ส่งคืนข้อมูลสำหรับภาพที่ระบุในรูปแบบ PNG

NSData * UIImagePNGRepresentation (
   UIImage *image
);

ที่นี่เอกสาร

แก้ไข:

หากคุณต้องการเข้าถึงไบต์ดิบที่ประกอบเป็น UIImage คุณสามารถใช้วิธีนี้:

CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
const uint8_t* bytes = [data bytes];

สิ่งนี้จะให้ภาพพิกเซล RGB ของภาพในระดับต่ำ (งดCFBridgingReleaseบิตถ้าคุณไม่ได้ใช้ ARC)


8
มีวิธีที่จะรับข้อมูลในรูปแบบที่มีอยู่แล้วหรือไม่?
devios1

1
Xcode แนะนำให้ฉันใช้(id)CFBridgingRelease(CGDataProviderCopyData(provider))เพื่อเป็นเจ้าของผลCDataRefตอบแทนโดยCGDataProviderCopyDataใน ARC
Mostruash

1
@mostruash: ขอบคุณฉันได้แก้ไขคำตอบเพื่อพิจารณาข้อเสนอแนะของคุณ
sergio

@sergio ฉันไม่เคยมีประสบการณ์กับ ARC ที่ไม่ใช่ Obj-C และฉันสงสัยว่าการปล่อยdataจะเพียงพอหรือไม่หรือหากยังมีหน่วยความจำรั่ว
Mostruash

1
สิ่งนี้จะไม่ช่วย คุณสมบัติ CIImage ถูกตั้งค่าต่อเมื่อเริ่มต้นด้วย imageWithCIImage: นอกจากนี้ยังไม่ใช่ข้อมูลที่ใช้โดยตรง แต่เป็นวัตถุแสดงรูปภาพอื่น
King-Wizard

161
NSData *imageData = UIImagePNGRepresentation(myImage.image);

4
ฉันใช้สายนี้ แต่มันช้ามาก
user2128531

5
โปรดทราบว่า imageFlags (เช่น imageOrientation) จะหายไปเมื่อใช้ UIImagePNGRepresentation นั่นเป็นเหตุผลที่ต้องการ UIImageJPEG แทนการนำเสนอ
Yony

26

หากคุณมีภาพภายใน UIImageView เช่น "myImageView" คุณสามารถทำสิ่งต่อไปนี้:

แปลงภาพของคุณโดยใช้ UIImageJPEGRepresentation () หรือ UIImagePNGR การนำเสนอ () เช่นนี้:

NSData *data = UIImagePNGRepresentation(myImageView.image);
//or
NSData *data = UIImageJPEGRepresentation(myImageView.image, 0.8);
//The float param (0.8 in this example) is the compression quality 
//expressed as a value from 0.0 to 1.0, where 1.0 represents 
//the least compression (or best quality).

คุณยังสามารถวางรหัสนี้ในบล็อก GCD และดำเนินการในเธรดอื่นซึ่งแสดง UIActivityIndicatorView ในระหว่างกระบวนการ ...

//*code to show a loading view here*

dispatch_queue_t myQueue = dispatch_queue_create("com.my.queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(myQueue, ^{ 

    NSData *data = UIImagePNGRepresentation(myImageView.image);
    //some code....

    dispatch_async( dispatch_get_main_queue(), ^{
        //*code to hide the loading view here*
    });
});

24

สร้างการอ้างอิงของภาพ ....

UIImage *rainyImage = [UIImage imageNamed:@"rainy.jpg"];

การแสดงภาพในมุมมองภาพ ... imagedisplayเป็นการอ้างอิงของ imageview:

imagedisplay.image = rainyImage;

แปลงเป็นNSDataโดยผ่านUIImageการอ้างอิงและให้คุณภาพการบีบอัดในค่าลอยตัว:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);

2

ทางออกใน Swift 4

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}

การcgImage.dataProviderเข้ารหัสข้อมูลเป็นอย่างไร? ดูเหมือนว่าจะแตกต่างจากข้อมูลUIImagePNGRepresentationและUIImageJPEGRepresentationเพราะไม่สามารถใช้สร้างภาพUIImage(data: imageData)ได้
มานูเอล

@Manuel ไม่แน่ใจ ฉันเพิ่งแปลงไวยากรณ์จากคำตอบของ Sergio เซร์คิโอน่าจะรู้ดีกว่า
Charlton Provatas

@ มานูเอลฉันสมมติว่าใช้ CoreGraphics API มันให้การแสดงข้อมูลระดับล่างของรูปภาพมากกว่าที่UIImageJPEGRepresentationมีให้ แต่ฉันเชื่อว่าวิธีนี้รักษารูปแบบการเข้ารหัสดั้งเดิมที่รูปภาพอยู่และไม่เข้ารหัสอีกครั้ง
Charlton Provatas

1

ใช้ if-let block ด้วย Data เพื่อป้องกันความผิดพลาดของแอพ & การใช้รหัสอย่างปลอดภัยเนื่องจากฟังก์ชัน UIImagePNGR การนำเสนอผลตอบแทนจะส่งกลับค่าที่ไม่จำเป็น

if let img = UIImage(named: "TestImage.png") {
    if let data:Data = UIImagePNGRepresentation(img) {
       // Handle operations with data here...         
    }
}

หมายเหตุ: ข้อมูลเป็นคลาส Swift 3 ใช้ข้อมูลแทน NSData ด้วย Swift 3

การใช้งานรูปภาพทั่วไป (เช่น png & jpg ทั้งคู่):

if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
        if let data:Data = UIImagePNGRepresentation(img) {
               handleOperationWithData(data: data)     
        } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) {
               handleOperationWithData(data: data)     
        }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

โดยใช้ส่วนขยาย:

extension UIImage {

    var pngRepresentationData: Data? {
        return UIImagePNGRepresentation(img)
    }

    var jpegRepresentationData: Data? {
        return UIImageJPEGRepresentation(self, 1.0)
    }
}

*******
if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
      if let data = img.pngRepresentationData {
              handleOperationWithData(data: data)     
      } else if let data = img.jpegRepresentationData {
              handleOperationWithData(data: data)     
     }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

0
- (void) imageConvert
{
     UIImage *snapshot = self.myImageView.image;
     [self encodeImageToBase64String:snapshot];
}    


call this method for image convert in base 64 
    -(NSString *)encodeImageToBase64String:(UIImage *)image
    {
        return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.