2015-06-30 10 views
8

Ho un UIImageView con un UIImage. Voglio assegnare una copia di queste immagini a due variabili. Sulla base di ciò che l'utente sta facendo l'immagine dovrebbe essere manipolata. Il problema è che l'immagine è la stessa in ogni variabile. Immagino, perché sono passati per riferimento.Come copiare un UIImage?

let image1 = imageView.image! 
let image2 = imageView.image! 

Come ottengo due copie separate di questa immagine?

Grazie!

Edit:

Quello che voglio raggiungere: basta ritagliare l'immagine uno, mantenere l'altro come l'originale.

let imageLeft = googleImageView.image! 
let imageRef = CGImageCreateCopy(googleImageView.image!.CGImage) 
let imageRight = UIImage(CGImage: imageRef!, scale: googleImageView.image!.scale, orientation: googleImageView.image!.imageOrientation) 

if translation.x < 0 { 
    let scale = imageLeft.scale 
    let newRect = CGRectMake(0, 0, (imageLeft.size.width + translation.x) * scale, imageLeft.size.height * scale) 
    let imageRef = CGImageCreateWithImageInRect(imageLeft.CGImage, newRect) 

    if let croppedImage = imageRef { 
     googleImageView.image = UIImage(CGImage: croppedImage, scale: scale, orientation: imageLeft.imageOrientation) 
    } 
} 
print("left image: \(imageLeft) right image \(imageRight)") 

Il codice di cui sopra stampa alla console:

left image: <UIImage: 0x7fd020dca070>, {111, 167} 
right image <UIImage: 0x7fd020dda430>, {111, 167} 
left image: <UIImage: 0x7fd020df9ba0>, {110, 167} 
right image <UIImage: 0x7fd020d45670>, {110, 167} 

... e così via. Quindi, ENTRAMBI le immagini hanno una nuova dimensione. Solo l'immagine a sinistra dovrebbe essere ritagliata.

+1

http://stackoverflow.com/a/6770387/3324388 – Aggressor

risposta

9

Come @Aggressor suggerito è possibile copiare l'immagine da IMAGEVIEW questo modo:

let newCgIm = CGImageCreateCopy(imageView.image?.CGImage) 
let newImage = UIImage(CGImage: newCgIm, scale: imageView.image!.scale, orientation: imageView.image!.imageOrientation) 
+0

Follow-up domanda: l'immagine viene copiato, ma è ancora manipolato come il primo. Qualche idea sul perché questo è il caso? – heikomania

+0

Questo codice prenderà Image da 'imageView' e lo salverà su un altro 'newImage' e non so esattamente quale azione stai eseguendo. –

+0

Voglio fare quanto segue: Ritaglia immagine1 ma mantieni l'originale come immagine2. Quando ritaglia immagine1, immagine2 viene ritagliata due. Modificherò la mia domanda per chiarire. – heikomania

2

C'è una nuova funzione di copia di CGImage viene fornito con Swift 3 e compatibile anche con Swift 4. Così si può utilizzare in questo modo

guard let cgImage = imageView.image?.cgImage?.copy() else { 
     return 
    } 
let newImage = UIImage(cgImage: cgImage, 
         scale: imageView.image!.scale, 
         orientation: imageView.image!.imageOrientation)