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 EXIFbasé 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!

Sagar - la méthode ci-dessous ne suis pas la cause de votre application à l'effondrement?
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