iOS: Recadrage d'une image saisie par un UIImagePickerController appareil photo avec incrustation
Je suis nouveau sur iOS, et j'ai été bashing tête contre le mur pendant ce au cours de la semaine à regarder autour en ligne pour les tutoriels tels que: Traiter avec les Exif des Images, Le redimensionnement des images, et beaucoup plus aléatoire des questions ici sur StackOverflow. À partir de là, j'ai pensé que >=iOS 4.0
, toutes les images prises à partir de l'appareil photo contient EXIF
basé sur les informations de rotation.
Ce qui ne marche pas: Après avoir essayé différentes techniques de recadrage de l'image, tout ce que j'fin, c'est le recadrage de l'image au hasard des coins et aussi, l'image semble être agrandie : Lorsque j'utilise un png
image à partir d'internet (qui ne contiennent pas de données EXIF), le recadrage est de travail. Par hasard, à coins, je veux dire, l'image finit par être rognée en haut à droite/en haut à gauche et d'un zoom avant.
Ce que je suis en train de réaliser:
Je suis en train de rogner une image 100 px
de haut et 100 px
de fond. Essentiellement, je suis à l'aide de deux superposition de bandes - 1 en haut et 1 en bas avec le CGRect(0.0, 0.0, SCREEN_WIDTH, 100.0)
[un 100.0 px
de hauteur bande à haut] et un autre CGRect(0.0, SCREEN_HEIGHT - 100, SCREEN_WIDTH, 100.0)
[un autre 100 px
de hauteur bande à bas]. J'ai besoin d'obtenir de l'image entre ces deux bandes: je suppose que la hauteur de l'image: SCREEN_HEIGHT - 200.0
.
Affichage UIImagePickerController pour appareil photo avec incrustation:
//SCREEN_HEIGHT = 480 and SCREEN_WIDTH = 320
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO)
{
NSLog(@"Camera not available");
return;
}
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.delegate = self;
imagePicker.allowsEditing = NO;
//Hide the controls
imagePicker.showsCameraControls = NO;
imagePicker.navigationBarHidden = YES;
//Make camera view full screen
imagePicker.wantsFullScreenLayout = YES;
//imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, CAMERA_TRANSFORM_X, CAMERA_TRANSFORM_Y);
//Overlay
//OverlayView is a plain UIView with the CGRects mentioned in the question.
OverlayView *overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
[overlay initOverlay:self];
imagePicker.cameraOverlayView = overlay;
[self presentModalViewController:imagePicker animated:YES];
Code pour faire pivoter l'image en fonction de EXIF imageOrientation
propriété et le recadrage
- (UIImage *) cropImage: (UIImage *) originalImage
{
CGRect cropRect = CGRectMake(0, 100.0, SCREEN_WIDTH, SCREEN_HEIGHT - 100);
CGRect transformedRect = [self TransformCGRectForUIImageOrientation:cropRect :originalImage.imageOrientation :originalImage.size];
CGImageRef resultImageRef = CGImageCreateWithImageInRect(originalImage.CGImage, transformedRect);
UIImage *newImage = [[[UIImage alloc] initWithCGImage:resultImageRef scale:1.0 orientation:originalImage.imageOrientation] autorelease];
return newImage;
}
- (CGRect) TransformCGRectForUIImageOrientation: (CGRect) source: (UIImageOrientation) orientation: (CGSize) imageSize {
switch (orientation) {
case UIImageOrientationLeft: { //EXIF #8
CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
imageSize.height, 0.0);
CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,
M_PI_2);
return CGRectApplyAffineTransform(source, txCompound);
}
case UIImageOrientationDown: { //EXIF #3
CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
imageSize.width, imageSize.height);
CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,
M_PI);
return CGRectApplyAffineTransform(source, txCompound);
}
case UIImageOrientationRight: { //EXIF #6
CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
0.0, imageSize.width);
CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,
M_PI + M_PI_2);
return CGRectApplyAffineTransform(source, txCompound);
}
case UIImageOrientationUp: //EXIF #1 - do nothing
default: //EXIF 2,4,5,7 - ignore
return source;
}
La cropImage
méthode semble fonctionner pour les images téléchargées à partir d'internet (qui ne contiennent pas de l'orientation de l'info).
Je suis à court d'options. Quelqu'un pourrait-il SVP m'aider?
Merci pour la lecture!
qui ci-dessous la méthode parlez-vous?
La réponse de Matt. J'ai exactement le problème et n'a pas réussi pendant un mois pour recadrer l'image correctement
Non, il a fonctionné parfaitement pour moi. Quelle erreur avez-vous?
L'application se bloque après l'avoir utilisé. Il consomme beaucoup de mémoire. Je suis en fait en utilisant AVFoundation directement et j'ai besoin de recadrer l'image
OriginalL'auteur Sagar Hatekar | 2011-12-13
Vous devez vous connecter pour publier un commentaire.
Quand vous le pouvez, il est plus facile de sauter le dessin des images avec des Graphiques de Base:
Il est thread-safe sur iOS 4.0 et plus tard, QA 1637.
+1, Accepté de! Génial, cela fonctionne puis - magnifiquement! MERCI UNE TONNE! Beaucoup Apprécié!
parfait! J'ai essayé plusieurs méthodes, aucune n'a fonctionné comme prévu compte tenu de l'orientation des images. Je termine toujours avec l'image de la rotation. merci.
est-il un moyen de faire un similaires recadrage, mais également le décalage en x des points? Je veux dire quelque chose comme le recadrage d'une rect, non seulement les parties supérieure et inférieure?
OriginalL'auteur Mats