2014-09-22 15 views
14

Xin vui lòng, giúp đỡ để hiểu những gì sai ở đây. Tôi đã thử cả Xcode 6.0.1 và Xcode 6.1 beta 2. Tôi có một phần mở rộng đơn giản.'CIImage là loại không khai báo' lỗi lạ

extension UIImage { 
    func saturate (toLevel level : Float) -> UIImage { 
     // create filter 
     let saturationFilter = CIFilter(name: "CIColorControls") 
     saturationFilter.setValue(self.CIImage, forKey: kCIInputImageKey) 
     saturationFilter.setValue(NSNumber.numberWithFloat(level), forKey: "inputSaturation") 

     // create context 
     let context = CIContext(options: nil) 

     // render image with filter 
ERROR: let renderedImage = saturationFilter.valueForKey(kCIOutputImageKey) as CIImage 
     let imageRef = context.createCGImage(renderedImage, fromRect: renderedImage.extent()) 

     return UIImage(CGImage: imageRef) 
    } 
} 

Nhưng trình biên dịch nói "Sử dụng loại không khai báo 'CIImage'". Cái quái gì thế? Tôi đã cố gắng nhập CoreImage, nhưng không có gì thay đổi

+0

Xem cùng vấn đề với cả CGImage và CIImage. Xảy ra trong Xcode 6.2 beta nhưng không phải Xcode 6.1. Chỉ trong tiện ích mở rộng UIImage. Ở những nơi khác xây dựng tốt. Bất kỳ cơ hội bạn có thể bao gồm các liên kết đến radar? –

+1

Vẫn còn một vấn đề trong Xcode 7.1. – jowie

Trả lời

16

Sử dụng CoreImage.CIImage thay vì CIImage để disambiguate.

7

Có vẻ là lỗi trong Xcode, typecasting Không chỉ bên trong khối mở rộng, Bạn có thể trực tiếp truy cập hình ảnh đầu ra bằng thuộc tính 'outputImage' thuộc loại CIImage. Không cần phải sử dụng valueForKey, Hãy thử mã dưới đây

extension UIImage { 
     func saturate (toLevel level : Float) -> UIImage { 
      // create filter 
      let saturationFilter = CIFilter(name: "CIColorControls") 
      saturationFilter.setValue(self.CIImage, forKey: kCIInputImageKey) 
      saturationFilter.setValue(NSNumber.numberWithFloat(level), forKey: "inputSaturation") 

      // create context 
      let context = CIContext(options: nil) 

      // render image with filter 
     let renderedImage = saturationFilter.outputImage 
     let imageRef = context.createCGImage(renderedImage, fromRect: renderedImage.extent()) 

      return UIImage(CGImage: imageRef) 
     } 
    } 

************************ Cập nhật ****** *****************

Tôi nghĩ Trong trường hợp của bạn ciImage thuộc tính của UIImagenil, đó là lý do tại sao sự cố của nó bị lỗi. Lưu ý rằng UIImage không thực tế là CIImage. Nói cách khác,của UIImage không chỉ là 0 nếu số UIImage được hỗ trợ bởi CIImage rồi (ví dụ: vì nó được tạo bởi imageWithCIImage :). Bạn không thể sử dụng điều này để biến một cách kỳ diệu UIImage thành một CIImage, như bạn có vẻ hy vọng sẽ làm.

Vì vậy, bạn cần phải khởi tạo hình ảnh với một trường hợp CIImage, Hãy thử như thế này để thoát khỏi vụ tai nạn

let image = UIImage(named: "test") 

    let ciImage = CIImage(image: image) 

    let imageWithCIImage = UIImage(CIImage: ciImage) 

    imageWithCIImage.saturate(toLevel: 0.5) 
+0

Tôi đã thử, nhưng tôi luôn luôn nhận được "lỗi nghiêm trọng: bất ngờ tìm thấy nil trong khi unwrapping một giá trị tùy chọn" trên letImageImage = saturationFilter.outputImage dòng –

+0

@VitaliyVashchenko có vẻ ciImage là nil, Hãy thử cập nhật câu trả lời. –

+0

Vì vậy, không có cách nào để chạy mã này. Bởi vì để tạo CCImage tôi phải sử dụng tên lớp này. Nhưng điều đó cũng tạo ra lỗi trên. –

17

Để tránh lỗi này, bạn có thể định nghĩa một kiểu bí danh.

typealias MYImage = CIImage 

Sau đó khai báo CIImage đầu vào trong lĩnh vực của mình như:

let inputImage = MYImage(image: self) 
+2

Có một giờ của cuộc đời tôi. Cảm ơn. –

+3

Hoặc 'typealias CIImage = CoreImage.CIImage' bên trong phương thức yêu cầu' CIImage'. –

Các vấn đề liên quan