UIImage를 NSData로 변환


170

내 앱에서이 코드를 사용하여 이미지를 보내는 데 도움이됩니다.

그러나 이미지가있는 이미지보기가 있습니다. appbundle에 파일이 없지만 내 측면에 이미지가 있습니다. 아래 코드를 어떻게 변경합니까? 내가 변환 할 수 있습니다 누군가는 어떻게 말해 줄 수 myimageNSData?

// 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
UIImageJPEGRepresentation, 이미지의 UIImagePNGRepresentation 반환을 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 픽셀의 저수준 표현을 제공합니다. CFBridgingReleaseARC를 사용하지 않는 경우 비트를 생략하십시오 .


8
이미 어떤 형식 으로든 데이터를 가져올 수있는 방법이 있습니까?
devios1

1
Xcode는 ARC에서 반환 된 (id)CFBridgingRelease(CGDataProviderCopyData(provider))소유권을 얻는 데 사용 하도록 제안합니다 . CDataRefCGDataProviderCopyData
mostruash

1
@mostruash : 감사합니다. 귀하의 제안을 고려하여 답변을 수정했습니다.
sergio jan

@sergio 나는 ARC가 아닌 Obj-C에 경험이 없으며 릴리스 data가 충분하거나 메모리 누수가 여전히 있는지 궁금합니다 .
mostruash

1
도움이되지 않습니다. CIImage 특성은 imageWithCIImage :로 초기화 된 경우에만 설정됩니다. 또한 이것은 직접 사용되는 데이터가 아니라 다른 이미지 표현 객체입니다.
King-Wizard

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

4
이 줄을 사용하고 있지만 매우 느립니다
user2128531

5
UIImagePNGRepresentation을 사용하면 imageFlags (예 : imageOrientation)가 손실됩니다. 그래서 UIImageJPEGRepresentation이 선호됩니다.
Yony

26

UIImageView 내에 이미지가있는 경우 (예 : "myImageView") 다음을 수행 할 수 있습니다.

다음과 같이 UIImageJPEGRepresentation () 또는 UIImagePNGRepresentation ()을 사용하여 이미지를 변환하십시오.

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

@Manuel 확실하지 않습니다. 방금 Sergio의 답변에서 구문을 변환했습니다. 세르지오는 아마 더 잘 알 것입니다.
Charlton Provatas

@Manuel CoreGraphics API를 사용하고 있기 때문에 제공하는 것보다 이미지의 하위 수준 데이터 표현을 제공한다고 가정 UIImageJPEGRepresentation합니다. 그러나이 솔루션은 이미지의 원래 인코딩 형식을 유지하고 다시 인코딩하지 않는다고 생각합니다.
Charlton Provatas

1

UIImagePNGRepresentation 함수는 선택적 값을 반환하므로 앱 충돌 및 코드의 안전한 실행을 방지하기 위해 데이터와 함께 if-let 블록을 사용하십시오.

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

참고 : 데이터 는 Swift 3 클래스입니다. Swift 3에서 NSData 대신 Data 사용

일반 이미지 작업 (예 : 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.