2013-03-20 12 views
11

Więc mam płótno (UIView) i UIImageView, akty płótno jako maska ​​nad ImageViewUIImageView obrazu upraw na podstawie UIView maskować

enter image description here

Używam UIGestureRecognizers aby powiększyć i obrócić UIImageView który jest pod płótnem.

chcę konwertować ostateczny obraz (pokaż na płótnie do UIImage jednym rozwiązaniem jest konwersja płótna na obrazie jak poniżej

UIGraphicsBeginImageContext(self.canvas.bounds.size); 
[self.canvas.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *newCombinedImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

teraz to działa dobrze, ale problem w tym rozwiązaniu jest obraz jest przycięty do wymiarów płótna więc rozdzielczość jest bardzo niska.

inna opcja i zbadać było korzystać z niektórych kategorii zwyczaj UIImage obracanie i skalowanie.

[[[self.photoImage image] imageRotatedByDegrees:rotaton_angle] 
    imageAtRect:CGRectMake(x,y width,height)] 

Muszę podać kąt obrotu (kąt obrotu podany przez UIGesture Delegata nie jest w stopniach lub radianach, wtedy jest x, y, szerokość, wysokość, wyobrażam sobie, że te potrzeby muszą być obliczane na podstawie pewnej skali, (dostaję wartość skali od delegata UIGesture, ale nie wydają się być poprawne dla tej funkcji)

Istnieje tu wiele rozwiązań, które prowadzą do przycinania i obrazowania za pomocą prostokąta. ale w moim przypadku rect nie jest tą samą skalą co obraz, dotyczy to również rotacji.

każda pomoc zostanie doceniona.

+0

Czy możesz umieścić kod, który otrzymuje obrót z aparatu do rozpoznawania gestów? Mówisz, że nie dostajesz obrotu w radianach, ale nagłówek 'UIRotationGestureRecognizer' twierdzi, że jego własność' rotation' jest podana w radianach. Powinieneś być w stanie wykonać obrót z UIRotationGestureRecognizer i użyć go w swojej metodzie 'imageRotatedByDegress: imageAtRect:'. –

+0

@AaronGolden tak u są poprawne, jednak wartość jest dla pojedynczego ruchu, udało mi się uzyskać skumulowaną wartość, jestem w stanie zrobić rotację i powiększanie, aby dopasować się teraz. po prostu trzeba wymyślić przesuwanie i im dobrze iść. –

Odpowiedz

2

Udało mi się to rozwiązać, oto moje rozwiązanie, zdecydowanie nie jest najczystsze, ale działa.

Potrzebowałem obsługiwać 3 rzeczy, przesuwać, powiększać i obracać.

najpierw użyłem do UIGestureRecognizer Delegata uzyskać wartości skumulowane zwiększając przy UIGestureRecognizerStateEnded dla wszystkich 3.

następnie do obrotu i stosowany tylko UIImage Kategoria omówione here

self.imagetoEdit = [self.imagetoEdit imageRotatedByRadians:total_rotation]; 

do powiększania (skala) i używał GPUImage (używam tego w aplikacji)

GPUImageTransformFilter *scaleFilter = [[GPUImageTransformFilter alloc] init]; 
[scaleFilter setAffineTransform:CGAffineTransformMakeScale(total_scale, total_scale)]; 
[scaleFilter prepareForImageCapture]; 
self.imagetoEdit = [scaleFilter imageByFilteringImage:self.imagetoEdit]; 

do panoramowania, robię to. (Nie najczystszy kod: S) również używając powyższej wzmianki UIImage + Categories.

CGFloat x_ = (translation_point.x/canvas.frame.size.width)*self.imagetoEdit.size.width; 
CGFloat y_ = (translation_point.y/canvas.frame.size.height)*self.imagetoEdit.size.height; 
CGFloat xx = 0; 
CGFloat yy = 0; 
CGFloat ww = self.imagetoEdit.size.width-x_; 
CGFloat hh = self.imagetoEdit.size.height-y_; 

if (translation_point.x < 0) { 
    xx = x_*-1; 
    ww = self.imagetoEdit.size.width + xx; 
} 

if (translation_point.y < 0) { 
    yy = y_*-1; 
    hh = self.imagetoEdit.size.height + yy; 
} 

CGRect cgrect = CGRectMake(xx,yy, ww, hh); 
self.imagetoEdit = [self.imagetoEdit imageAtRect:cgrect]; 

wszystko wydaje się działać.

1

To może być pomocne ... Resizing a UIImage the right way

Może potrzebują odnowienia dla ARC etc ... choć myślę, że są ludzie, którzy zrobili to i zamieścił go na Github.

+0

[[obraz self.photoImage] imageRotatedByDegrees: rotaton_angle] imageAtRect: CGRectMake (x, y szerokość, wysokość)], mam te kategorie UIImage, ale muszę podać im kąt obrotu (agung rotacji dostarczony przez UIGesture Delegate jest nie w stopniach i radianach, to jest x, y, szerokość, wysokość, wyobrażam sobie, że te potrzeby muszą być obliczane na podstawie pewnej skali (otrzymuję wartość skali od delegata UIGesture, ale nie wydają się być poprawne dla tej funkcji) –

+0

Edytowałem pytanie, aby to uwzględnić. –

Powiązane problemy