2013-03-20 12 views
11

Così ho una tela (UIView) e un'UIImageView, gli atti di tela come una maschera sul imageviewUIImageView ritaglio immagine sulla base di UIView mascherare

enter image description here

sto usando UIGestureRecognizers per ingrandire e ruotare le UIImageView che è sotto la tela.

voglio convertire l'immagine finale (spettacolo in tela per un UIImage, una soluzione è quello di convertire la tela per un'immagine come di seguito

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

ora questo funziona bene, ma il problema con questa soluzione è l'immagine viene ritagliata alle dimensioni della tela quindi la risoluzione è molto bassa.

un'altra opzione ho esplorato era di utilizzare alcune categorie UIImage personalizzato per ruotare e scala.

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

ho bisogno di fornire l'angolo di rotazione (l'angolo di rotazione fornito da UIGesture Delegate non è in gradi o radianti, quindi c'è x, y, larghezza, altezza, immagino che questi debbano essere calcolati in base ad alcune scale, (ottengo valore in scala dal delegato UIGesture ma non sembrano essere corretti per questa funzione)

ci sono un certo numero di soluzioni qui, che ti guida a ritagliare e immagine dato un retto. ma nel mio caso il rect non è la stessa scala dell'immagine, anche se è coinvolta la rotazione.

qualsiasi aiuto sarà apprezzato.

+0

Puoi pubblicare il codice che ottiene la rotazione dal riconoscimento di gesti? Si dice che non si ottiene la rotazione in radianti, ma l'intestazione per 'UIRotationGestureRecognizer' afferma che la sua proprietà' rotation' è espressa in radianti. Dovresti essere in grado di prendere la rotazione da un UIRotationGestureRecognizer e usarlo nel tuo metodo imageRotatedByDegress: imageAtRect: '. –

+0

@AaronGolden sì, sei corretto, tuttavia il valore è per un movimento singolo, sono riuscito a ottenere il valore cumulativo, in grado di fare la rotazione e lo zoom per abbinare ora. ho solo bisogno di capire il panning e sto bene. –

risposta

2

sono riuscito a risolvere questo, ecco la mia soluzione, non è sicuramente la più pulita, ma funziona.

avevo bisogno di gestire 3 cose, pan, zoom e ruotare.

innanzi tutto utilizzato il delegato UIGestureRecognizer per ottenere valori cumulativi incremento a UIGestureRecognizerStateEnded per tutti 3.

poi per rotazione ho appena usato l'UIImage Categoria discusso here

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

per zoom (scala) i usato GPUImage (sto usando questo in tutta l'app)

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

per panning, sto facendo questo. (Non il codice più pulito: S) utilizzando anche la menzione UII + Categorie sopra menzionate.

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]; 

tutto sembra funzionare.

1

Questo potrebbe essere utile ... Resizing a UIImage the right way

Potrebbe bisogno di un rinnovamento per ARC ecc ... se penso che ci sono persone che hanno fatto e hanno postato su Github.

+0

[[[autoscattoImmagine immagine] imageRotatedByDegrees: rotaton_angle] imageAtRect: CGRectMake (x, y width, height)], ho queste categorie UIImage, ma ho bisogno di fornire loro l'angolo di rotazione (l'agnolo di rotazione fornito da UIGesture Delegate è non in Gradi o Radianti, quindi c'è x, y, larghezza, altezza, immagino che questi debbano essere calcolati in base ad una scala, (ottengo il valore di scala dal delegato UIGesture ma non sembrano essere corretti per questa funzione) –

+0

ho modificato la domanda per includerla. –

Problemi correlati