UIImage에서 기본 NSData 가져 오기


104

또는 방법 UIImageNSData사용하여 만들 수 있습니다 . [UIImage imageWithData:][UIImage initWithData:]

NSData기존 에서 되 찾을 수 UIImage있을까? 라인에 뭔가NSData *myData = [myImage getData];

답변:


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

또는

NSData *imageData = UIImagePNGRepresentation(image);

데이터를 PNG 형식 또는 JPG 형식으로 원하는지 여부에 따라 다릅니다.


82
이 답변이 왜 그렇게 여러 번 찬성 투표를 받았는지 또는 수락되었는지 모르겠습니다. OP는 처음에 제공된 데이터를 검색하도록 요청했습니다. 사용 UIImageJPEGRepresentation또는 UIImagePNGRepresentation 것입니다 데이터를 변경하고 재 변환을한다. 요청한 것을 실제로 달성 할 수있는 방법이 있습니까?
Patrik 2013 년

6
이미지가 이미 손실 형식 인 경우 이미지의 품질이 저하되기 때문에이 대답은 좋지 않습니다.
1dayitwillmake 2013

@CipherCom 나는 정확한 데이터를 원한다는 것에 대해 당신이 말하는 것을 봅니다. 그러나 질문을받는 대다수의 사람들에게이 답변은 그들의 요구에 완벽 할 것이라고 생각합니다. ), 당신은 원래 데이터 등을 가져 오기위한 답변을 통해, 제발 점유율을 올 경우
tybro0103

@ 1dayitwillmake 심지어 PNG 담당자? 내 전문 분야는 아니지만 PNG가 손실을 입지 않는다고 생각 했습니까?
tybro0103

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

21

초기화하는 경우 UIImage와 물체 init(data: originalData), originalData내부 포맷 일종의 원 데이터 (raw data)로 변환 될 것이다. 이러한 데이터는 나중에 검색 할 수 있습니다.

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

그러나 rawData는 원시 이기 때문에 를 사용할 때보 다 훨씬 더 커질 것 UIImagePNGRepresentation입니다.


Objective-C에서이 작업을 수행하는 방법
h3dkandi

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

@ZardozSpeaks obj-c 변형은이 답변에 편집으로 포함될 수 있습니다.
Kamil.S

6

UIImage는 표시 용으로 형식이 지정된 개체이므로 원본 데이터 (아마도 PNG 또는 JPEG 형식)를 사용하지 않지만 픽셀 배열 또는 기타 내부 형식 일 가능성이 높습니다. 즉, UIImage(data: foo)은 유지되지 않습니다 foo.

  1. 프로그램의 다른 곳에서 사용하고 싶다면 원래 UIImage가 잘 작동합니다 (실제로는 그렇지 않다고 가정합니다)

  2. 직렬화하려는 경우 UIImagePNGRepresentation(...)작동하지만 원본이 JPEG이면 크기가 커집니다. UIImageJPEGRepresentation(...)종종 약간 큰 데이터가 생성되며 원본이 PNG 인 경우 약간 손실됩니다. 이미지가 표시되는 방식과 제공 될 것으로 예상되는 형식에 따라 하나를 선택하는 것이 좋습니다. PNG를 사용 중이고 PNG를 내보내려면 좋은 파일 크기와 거의 동일한 데이터, 특수 PNG 청크는 제쳐두고 있어야합니다.

  3. 원본 데이터의 정확한 사본을 얻으려면 (예 : 축소판으로 파일을 저장하거나 SHA1에 저장) 별도로 보관해야합니다. 다음과 같이 할 수 있습니다.

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

4

내가 이것을 우연히 만났고 나는 스위프트를 좋아하기 때문에 :)

다음은 Caroiline의 게시물을 신속하게 번역 한 것입니다.

var imageData = UIImagePNGRepresentation(image)

또는

var imageData = UIImageJPEGRepresentation(image, 0.7) 

신속한 문제가 아닙니다.
Cross_

3

스위프트 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

CipherCom의 우려를 공유하기 때문에 여전히 찾고있는 사람들을 위해 위의 답변이 제공된 이후 상황이 변경되었습니다 .iOS 5는 CIImage 속성을 추가 했습니다 .


CIImage를 사용하여 기본 NSData를 가져 오는 방법이 보이지 않습니다. 뭔가 빠졌나요?
tybro0103 2014 년

4
이것은 도움이되지 않습니다. 속성 CIImage은로 초기화 된 경우에만 설정됩니다 imageWithCIImage:. 또한 이것은 직접 사용되는 데이터가 아니라 다른 이미지 표현 객체입니다.
Patrik 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.