2015-06-30 44 views
8

Tôi có UIImageView với UIImage. Tôi muốn gán một bản sao của những hình ảnh này cho hai biến. Dựa trên những gì người dùng đang thực hiện hình ảnh nên được thao tác. Vấn đề là, hình ảnh giống nhau trong mỗi biến. Tôi đoán, bởi vì chúng được chuyển qua tham chiếu.Làm cách nào để sao chép UIImage?

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

Làm cách nào để có hai bản sao riêng biệt của hình ảnh này?

Cảm ơn bạn!

Edit:

Những gì tôi muốn đạt được: Chỉ cần cắt một hình ảnh, giữ khác như bản gốc.

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

Đoạn mã trên bản in ra cửa sổ 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} 

... và vân vân. Vì vậy, cả hai hình ảnh được một kích thước mới. Chỉ hình ảnh bên trái sẽ bị cắt.

+1

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

Trả lời

9

Như @Aggressor gợi ý bạn có thể sao chép hình ảnh của bạn từ IMAGExem theo cách này:

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

Theo dõi câu hỏi: Những hình ảnh được sao chép, nhưng nó vẫn được chế tác như là người đầu tiên. Bất kỳ ý tưởng tại sao đây là trường hợp? – heikomania

+0

Mã này sẽ lấy Ảnh từ 'imageView' và lưu nó vào một' newImage' khác và tôi không biết chính xác bạn đang thực hiện hành động nào. –

+0

Tôi muốn làm như sau: Cắt hình ảnh1 nhưng giữ nguyên bản gốc dưới dạng image2. Khi tôi cắt hình ảnh1, image2 bị cắt hai. Tôi sẽ chỉnh sửa câu hỏi của mình để làm rõ. – heikomania

2

Có một chức năng bản sao mới của cgImage đi kèm với Swift 3 và cũng tương thích với Swift 4. Vì vậy, bạn có thể sử dụng theo cách này

guard let cgImage = imageView.image?.cgImage?.copy() else { 
     return 
    } 
let newImage = UIImage(cgImage: cgImage, 
         scale: imageView.image!.scale, 
         orientation: imageView.image!.imageOrientation) 
Các vấn đề liên quan