2012-02-01 30 views
10

Tôi đang sử dụng một số bộ lọc CoreImage để xử lý hình ảnh. Áp dụng bộ lọc cho hình ảnh đầu vào của tôi tạo ra một hình ảnh đầu ra được gọi là filterOutputImage của loại CIImage.Tạo UIImage từ CIImage

bây giờ tôi muốn hiển thị hình ảnh đó, và cố gắng thực hiện: Tuy nhiên

self.modifiedPhoto = [UIImage imageWithCIImage:filterOutputImage]; 
self.photoImageView.image = self.modifiedPhoto; 

Quan điểm là trống - không có gì đang được hiển thị.

Nếu tôi thêm các câu lệnh ghi nhật ký để in chi tiết về cả filterOutputImage và self.modifiedPhoto, thì những câu lệnh khai báo đó cho tôi thấy rằng cả hai vars đó đều chứa dữ liệu hình ảnh hợp lệ: kích thước của chúng đang được báo cáo và các đối tượng không phải là không.

Vì vậy, sau khi thực hiện một số Googling, tôi đã tìm thấy một giải pháp yêu cầu phải trải qua một giai đoạn CGImage; vis:

CGImageRef outputImageRef = [context createCGImage:filterOutputImage fromRect:[filterOutputImage extent]]; 
self.modifiedPhoto = [UIImage imageWithCGImage:outputImageRef scale:self.originalPhoto.scale orientation:self.originalPhoto.imageOrientation]; 
self.photoImageView.image = self.modifiedPhoto; 
CGImageRelease(outputImageRef); 

Cách tiếp cận thứ hai này hoạt động: Tôi nhận được hình ảnh chính xác được hiển thị trong chế độ xem.

Ai đó có thể giải thích cho tôi lý do tại sao lần thử đầu tiên của tôi không thành công? Tôi đang làm gì sai với phương thức imageWithCIImage dẫn đến hình ảnh dường như tồn tại nhưng không thể hiển thị? Có luôn luôn cần phải "vượt qua" một giai đoạn CGImage để tạo ra một UIImage từ một CIImage không?

Hy vọng ai đó có thể làm sáng tỏ sự nhầm lẫn của tôi :)

H.

Trả lời

8

tôi cho rằng self.photoImageView là một UIImageView? Nếu vậy, cuối cùng, nó sẽ gọi -[UIImage CGImage] trên UIImage và sau đó vượt qua CGImage đó làm thuộc tính contents của một CALayer.

(Xem ý kiến: Các chi tiết của tôi đã sai)

mỗi tài liệu UIImage cho -[UIImage CGImage]:

If the UIImage object was initialized using a CIImage object, the 
value of the property is NULL. 

Vì vậy, các UIImageView gọi -CGImage, nhưng có kết quả trong NULL, vì vậy không có gì được hiển thị.

Tôi chưa thử điều này, nhưng bạn có thể thử tạo UIView tùy chỉnh và sau đó sử dụng phương pháp -draw... của UIImage trong -[UIView drawRect:] để vẽ CIImage.

+0

Ahh! Cảm ơn bạn. Có, photoImageView là UIImageView. Tôi không biết nó sử dụng tài sản CGImage của UIImage. – Hamster

+0

Một câu hỏi nữa, trong đó tài liệu được giải thích cách UIImageView hiển thị hình ảnh của nó? Tôi đang cố gắng để tìm ra nơi bạn đã học được rằng từ :) – Hamster

+0

Thực ra, bây giờ tôi thực sự nhìn vào mã nhị phân: UIImageView ghi đè -drawRect: thay vì gọi setContents: trên lớp riêng của nó. Dường như nó cuối cùng gọi vào các phương thức vẽ UIImage, lấy CGImageRef và vẽ nó. Vì vậy, kết quả tương tự, nhưng chi tiết của tôi đã sai. – iccir

15

Điều này nên làm điều đó!

-(UIImage*)makeUIImageFromCIImage:(CIImage*)ciImage 
{ 
    self.cicontext = [CIContext contextWithOptions:nil]; 
    // finally! 
    UIImage * returnImage; 

    CGImageRef processedCGImage = [self.cicontext createCGImage:ciImage 
                 fromRect:[ciImage extent]]; 

    returnImage = [UIImage imageWithCGImage:processedCGImage]; 
    CGImageRelease(processedCGImage); 

    return returnImage; 
} 
Các vấn đề liên quan