objective c - Salvando 2 UIImages a uno mentre si salva la rotazione, le informazioni di ridimensionamento e la sua qualità



objective-c ios (2)

Voglio salvare 2 UIImages che vengono spostati, ridimensionati e ruotati dall'utente. Il problema è che non voglio usare una funzione come quella di un 'printcreen', perché fa sì che entrambe le immagini perdano molto dalla loro qualità (risoluzione).

Atm uso qualcosa come questo:

UIGraphicsBeginImageContext(image1.size);
[image1 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];
[image2 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Tuttavia, aggiunge solo due immagini, la loro rotazione, il ridimensionamento e lo spostamento non viene gestito qui. Qualcuno può aiutare a considerare questi 3 aspetti nella codifica? Qualsiasi aiuto è apprezzato!

Il mio più grande ringraziamento in anticipo :)

MODIFICA: le immagini possono essere ruotate e ingrandite dall'utente (gestione degli eventi tattili)!

https://ffff65535.com


Prova questo:

UIImage *temp = [[UIImage alloc] initWithCGImage:image1 scale:1.0 orientation: yourOrientation];
[temp drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];

Allo stesso modo per image2. La rotazione e il ridimensionamento sono gestiti rispettivamente dall'orientamento e dalla scala. yourOrientation è una variabile enum di UIImageOrientation e può avere un valore compreso tra 0 e 7 (controlla questa documentazione Apple su diversi valori di UIImageOrientation). Spero che sia d'aiuto...

MODIFICA: per gestire le rotazioni, basta scrivere l'orientamento desiderato per la rotazione richiesta. È possibile ruotare di 90 gradi a sinistra / a destra o capovolgere verticalmente / orizzontalmente. Ad esempio, nella documentazione Apple, UIImageOrientationUp è 0, UIImageOrientationDown è 1 e così via. Controlla il mio repository Github per un esempio.


Devi impostare la trasformazione del contesto in modo che corrisponda alla trasformazione di imageView prima di iniziare a disegnarla.

vale a dire,

CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, boundingRect.size.width/2, boundingRect.size.height/2);
transform = CGAffineTransformRotate(transform, angle);
transform = CGAffineTransformScale(transform, 1.0, -1.0);

CGContextConcatCTM(context, transform);

// Draw the image into the context
CGContextDrawImage(context, CGRectMake(-imageView.image.size.width/2, -imageView.image.size.height/2, imageView.image.size.width, imageView.image.size.height), imageView.image.CGImage);

// Get an image from the context
rotatedImage = [UIImage imageWithCGImage: CGBitmapContextCreateImage(context)];

e controlla Creazione di una UIImmagine da una UIImageView ruotata .

EDIT: se non si conosce l'angolo di rotazione dell'immagine, è possibile ottenere la trasformazione dalla proprietà layer di UIImageView:

UIGraphicsBeginImageContext(rotatedImageView.image.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGAffineTransform transform = rotatedImageView.transform;
transform = CGAffineTransformScale(transform, 1.0, -1.0);
CGContextConcatCTM(context, transform);

// Draw the image into the context
CGContextDrawImage(context, CGRectMake(0, 0, rotatedImageView.image.size.width, rotatedImageView.image.size.height), rotatedImageView.image.CGImage);

// Get an image from the context
UIImage *newRotatedImage = [UIImage imageWithCGImage: CGBitmapContextCreateImage(context)];

UIGraphicsEndImageContext();

Dovrai giocare con la matrice di trasformazione per centrare l'immagine nel contesto e dovrai anche calcolare un rettangolo di delimitazione per l'immagine ruotata o verrà ritagliata agli angoli (cioè, ruotatedImageView.image.size non è grande abbastanza da comprendere una versione ruotata di se stesso).





zoom