UI 이미지를 NSData로 변환하고 Swift에서 UI 이미지로 다시 변환하시겠습니까?
나는 저장하려고 노력 중입니다.UIImage
로.NSData
그리고 나서 그것을 읽습니다.NSData
새로운 것으로 돌아가는UIImage
스위프트에서변환하기UIImage
로.NSData
다음 코드를 사용하고 있습니다.
let imageData: NSData = UIImagePNGRepresentation(myImage)
변환 방법imageData
(즉,NSData
) 새로운 것으로 돌아가기UIImage
?
UIImage(data:imageData,scale:1.0)
이미지의 배율을 1로 가정합니다.
swift 4.2에서는 get Data()에 대해 아래 코드를 사용합니다.
image.pngData()
감사합니다. 많은 도움이 되었습니다.스위프트 3로 전환하여 작업함
저장 방법:let data = UIImagePNGRepresentation(image)
로드 방법:let image = UIImage(data: data)
다음과 같이 Swift로 번역되는 방법을 사용합니다.UIImage(data:)
let image : UIImage = UIImage(data: imageData)
이제 Swift 4.2에서 사용할 수 있습니다.pngData()
의 새로운 인스턴스 방법UIImage
이미지에서 데이터를 가져옵니다.
let profileImage = UIImage(named:"profile")!
let imageData = profileImage.pngData()
세부 사항
- Xcode 10.2.1(10E1001), Swift 5
솔루션 1
guard let image = UIImage(named: "img") else { return }
let jpegData = image.jpegData(compressionQuality: 1.0)
let pngData = image.pngData()
솔루션 2.1
extension UIImage {
func toData (options: NSDictionary, type: CFString) -> Data? {
guard let cgImage = cgImage else { return nil }
return autoreleasepool { () -> Data? in
let data = NSMutableData()
guard let imageDestination = CGImageDestinationCreateWithData(data as CFMutableData, type, 1, nil) else { return nil }
CGImageDestinationAddImage(imageDestination, cgImage, options)
CGImageDestinationFinalize(imageDestination)
return data as Data
}
}
}
솔루션 2.1 사용
// about properties: https://developer.apple.com/documentation/imageio/1464962-cgimagedestinationaddimage
let options: NSDictionary = [
kCGImagePropertyOrientation: 6,
kCGImagePropertyHasAlpha: true,
kCGImageDestinationLossyCompressionQuality: 0.5
]
// https://developer.apple.com/documentation/mobilecoreservices/uttype/uti_image_content_types
guard let data = image.toData(options: options, type: kUTTypeJPEG) else { return }
let size = CGFloat(data.count)/1000.0/1024.0
print("\(size) mb")
솔루션 2.2
extension UIImage {
func toJpegData (compressionQuality: CGFloat, hasAlpha: Bool = true, orientation: Int = 6) -> Data? {
guard cgImage != nil else { return nil }
let options: NSDictionary = [
kCGImagePropertyOrientation: orientation,
kCGImagePropertyHasAlpha: hasAlpha,
kCGImageDestinationLossyCompressionQuality: compressionQuality
]
return toData(options: options, type: .jpeg)
}
func toData (options: NSDictionary, type: ImageType) -> Data? {
guard cgImage != nil else { return nil }
return toData(options: options, type: type.value)
}
// about properties: https://developer.apple.com/documentation/imageio/1464962-cgimagedestinationaddimage
func toData (options: NSDictionary, type: CFString) -> Data? {
guard let cgImage = cgImage else { return nil }
return autoreleasepool { () -> Data? in
let data = NSMutableData()
guard let imageDestination = CGImageDestinationCreateWithData(data as CFMutableData, type, 1, nil) else { return nil }
CGImageDestinationAddImage(imageDestination, cgImage, options)
CGImageDestinationFinalize(imageDestination)
return data as Data
}
}
// https://developer.apple.com/documentation/mobilecoreservices/uttype/uti_image_content_types
enum ImageType {
case image // abstract image data
case jpeg // JPEG image
case jpeg2000 // JPEG-2000 image
case tiff // TIFF image
case pict // Quickdraw PICT format
case gif // GIF image
case png // PNG image
case quickTimeImage // QuickTime image format (OSType 'qtif')
case appleICNS // Apple icon data
case bmp // Windows bitmap
case ico // Windows icon data
case rawImage // base type for raw image data (.raw)
case scalableVectorGraphics // SVG image
case livePhoto // Live Photo
var value: CFString {
switch self {
case .image: return kUTTypeImage
case .jpeg: return kUTTypeJPEG
case .jpeg2000: return kUTTypeJPEG2000
case .tiff: return kUTTypeTIFF
case .pict: return kUTTypePICT
case .gif: return kUTTypeGIF
case .png: return kUTTypePNG
case .quickTimeImage: return kUTTypeQuickTimeImage
case .appleICNS: return kUTTypeAppleICNS
case .bmp: return kUTTypeBMP
case .ico: return kUTTypeICO
case .rawImage: return kUTTypeRawImage
case .scalableVectorGraphics: return kUTTypeScalableVectorGraphics
case .livePhoto: return kUTTypeLivePhoto
}
}
}
}
솔루션 2.2 사용
let compressionQuality: CGFloat = 0.4
guard let data = image.toJpegData(compressionQuality: compressionQuality) else { return }
printSize(of: data)
let options: NSDictionary = [
kCGImagePropertyHasAlpha: true,
kCGImageDestinationLossyCompressionQuality: compressionQuality
]
guard let data2 = image.toData(options: options, type: .png) else { return }
printSize(of: data2)
문제
이미지 표현에는 많은 CPU 및 메모리 리소스가 필요합니다.따라서 이 경우 몇 가지 규칙을 따르는 것이 좋습니다.
메인 큐에서 jpegData(compressionQuality:)를 실행하지 않음
하나의 jpegData(compressionQuality:)만 동시에 실행합니다.
틀렸습니다:
for i in 0...50 {
DispatchQueue.global(qos: .utility).async {
let quality = 0.02 * CGFloat(i)
//let data = image.toJpegData(compressionQuality: quality)
let data = image.jpegData(compressionQuality: quality)
let size = CGFloat(data!.count)/1000.0/1024.0
print("\(i), quality: \(quality), \(size.rounded()) mb")
}
}
오른쪽:
let serialQueue = DispatchQueue(label: "queue", qos: .utility, attributes: [], autoreleaseFrequency: .workItem, target: nil)
for i in 0...50 {
serialQueue.async {
let quality = 0.02 * CGFloat(i)
//let data = image.toJpegData(compressionQuality: quality)
let data = image.jpegData(compressionQuality: quality)
let size = CGFloat(data!.count)/1000.0/1024.0
print("\(i), quality: \(quality), \(size.rounded()) mb")
}
}
링크
데이터로 저장하기
StoryBoard에서 "이미지" 데이터를 MainStoryBoard의 imageView에 저장하려면 다음 코드가 작동합니다.
let image = UIImagePNGRepresentation(imageView.image!) as NSData?
이미지 보기에 "이미지"를 로드하는 방법느낌표 "!", "?"가 이 느낌표와 완전히 같은지 자세히 보세요.
imageView.image = UIImage(data: image as! Data)
이 과정에서 "NSData" 유형이 "Data" 유형으로 자동 변환됩니다.
이미지에서 데이터로:-
if let img = UIImage(named: "xxx.png") {
let pngdata = img.pngData()
}
if let img = UIImage(named: "xxx.jpeg") {
let jpegdata = img.jpegData(compressionQuality: 1)
}
이미지로 데이터:-
guard let image = UIImage(data: pngData) else { return }
코드의 안전한 실행을 위해,if-let
로 막다.Data
앱 충돌을 방지하기 위해 & , 기능으로UIImagePNGRepresentation
선택적 값을 반환합니다.
if let img = UIImage(named: "TestImage.png") {
if let data:Data = UIImagePNGRepresentation(img) {
// Handle operations with data here...
}
}
참고: 데이터는 Swift 3+ 클래스입니다.Swift 3+에서는 NSData 대신 데이터 사용
일반 이미지 작업(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(self)
}
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...
}
}
스위프트 5
UI 이미지로 생성한 이미지를 이미지로 만듭니다.
image.pngData() as NSData?
간단한 솔루션에 사용합니다.
static var UserProfilePhoto = UIImage()
guard let image = UIImage(named: "Photo") else { return }
guard let pngdata = image.pngData() else { return }
UserProfilePhoto = UIImage(data: pngdata)!
언급URL : https://stackoverflow.com/questions/32297704/convert-uiimage-to-nsdata-and-convert-back-to-uiimage-in-swift
'programing' 카테고리의 다른 글
C# - Windows 64비트에서 프로그램 파일(x86)을 가져오는 방법 (0) | 2023.05.29 |
---|---|
대상 컴퓨터가 이를 적극적으로 거부하여 연결할 수 없습니다. (0) | 2023.05.29 |
정말 이상한 이클립스 키보드 동작/버그? (0) | 2023.05.24 |
오류: 네임스페이스 'std'에 'remove_cv_t'라는 템플릿이 없습니다. 'remove_cv'를 의미합니까? (0) | 2023.05.24 |
열 이름이 있는 행당 하나의 열을 표시하는 psql의 대체 출력 형식 (0) | 2023.05.24 |