2015-06-30 17 views
8

Mam UIImageView z UIImage. Chcę przypisać kopię tego obrazu do dwóch zmiennych. Na podstawie tego, co robi użytkownik, obraz powinien zostać zmanipulowany. Problem polega na tym, że obraz jest taki sam w każdej zmiennej. Chyba dlatego, że są przekazywane przez odniesienie.Jak skopiować UIImage?

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

Jak uzyskać dwie oddzielne kopie tego obrazu?

Dziękujemy!

Edit:

Co chcę osiągnąć: Wystarczy przyciąć jedno zdjęcie, należy pamiętać o innych podobnych oryginału.

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)") 

Powyższy kod drukuje do konsoli:

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

... i tak dalej. Zarówno OBRAZY uzyskują nowy rozmiar. Tylko lewy obraz powinien zostać przycięty.

+1

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

Odpowiedz

9

Jak @Aggressor zasugerował można skopiować obraz z ImageView ten sposób:

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

Kontynuacja pytanie: Obraz zostanie skopiowany, ale wciąż jest manipulowany jak pierwszego. Czy masz jakieś pojęcie, dlaczego tak się dzieje? – heikomania

+0

Ten kod pobierze obraz z 'imageView' i zapisze go na innym 'newImage' i nie wiem dokładnie, jaką akcję wykonujesz. –

+0

Chcę wykonać następujące czynności: Przytnij zdjęcie 1, ale zachowaj oryginał jako zdjęcie2. Gdy przycinam obraz1, zdjęcie 2 zostanie przycięte dwa. Zmienię moje pytanie w celu wyjaśnienia. – heikomania

2

Jest nowa funkcja Kopia cgImage wyposażony Swift 3 a także kompatybilny z Swift 4. Dzięki czemu można korzystać w ten sposób

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