2011-11-10 15 views
8

Dzięki za przeczytanie.Używanie CoreImage do filtrowania obrazu powoduje obrót obrazu.

Próbuję użyć CoreImage w iOS 5, aby zmienić wygląd obrazu. Problem polega na tym, że istniejący obraz wydaje się tracić orientację podczas procesu i kończy się obrócony o 90 stopni.

Oto kod:

CIContext *context = [CIContext contextWithOptions:nil]; 
CIImage *img = [CIImage imageWithCGImage:imageView.image.CGImage]; 
CIFilter *adjustFilter = [CIFilter filterWithName:@"CIHighlightShadowAdjust"]; 

[adjustFilter setDefaults]; 
[adjustFilter setValue:img forKey:kCIInputImageKey]; 
[adjustFilter setValue:[NSNumber numberWithFloat:0.3] forKey:@"inputShadowAmount"]; 
CIImage *adjustedImage = [adjustFilter valueForKey:kCIOutputImageKey]; 
UIImage *newPtImage = [UIImage imageWithCGImage:[context adjustedImage fromRect:adjustedImage.extent]]; 

imageView.image = newPtImage; 

Oryginalny obraz na ogół pochodzi z jednego podjętej przez aparat, ale nie zawsze.

Mam nadzieję, że ktoś może pomóc.

Rob.

Odpowiedz

2

Zapraszamy do obejrzenia tej odpowiedzi https://stackoverflow.com/q/538064/871102

można rozwiązać problemu przekazując obraz do sposobu z poprzedniej odpowiedzi. Więc zamiast:

CIImage *img = [CIImage imageWithCGImage:imageView.image.CGImage]; 

zapisu:

UIImage *fixedImage = [self scaleAndRotateImage:imageView.image]; 
CIImage *img = [CIImage imageWithCGImage:fixedImage.CGImage]; 

UPDATE:

Jest bardziej elegancki odpowiedź bez skalowania obrazu tutaj: iOS UIImagePickerController result image orientation after upload.

+0

Dzięki. Naprawdę rozwiązałem mój konkretny problem, dodając –

+3

To nie działało. Przebiegł kod, ale nic się nie stało. I jest o wiele za długa i jest hacky. –

+0

Jak to by było w Swift? Proszę, powiedz mi! – Pixele9

35

W rzeczywistości rozwiązanie mojego problemu okazało się dość proste. Ponieważ CGImage traci orientację i skalę czynników, ja po prostu potrzebne, aby dodać

UIImageOrientation originalOrientation = imageView.image.imageOrientation; 
CGFloat originalScale = imageView.image.scale; 

na początku kodu, a następnie wykorzystywane to zamiast [UIImage imageWithCGImage:]

UIImage *newPtImage = [UIImage imageWithCGImage:img2 scale:originalScale orientation:originalOrientation]; 

Dzięki za sugestie zbyt.

+0

Dzięki Rob. To działało idealnie! –