2012-12-26 3 views
2

Je crée une application pour iPhone avec une fonction de recadrage d'image. En cela, j'obtiens les photos du UIImagePickerController et je le passe pour le recadrage. Là, il a un scrollview et l'image sélectionnée sera ajoutée comme une sous-vue à la scrollview. Et j'utilise un UIButton pour sélectionner la zone à recadrer. L'utilisateur peut déplacer le bouton sur l'imageview et le placer n'importe où, et lorsque vous cliquez sur le bouton CROP, la zone similaire à la taille du cadre du bouton doit être recadrée à partir de l'imageview.Problème de cadrage d'image dans iOS

J'ai utilisé le code suivant, mais il ne retourne pas l'image réelle.

CGRect clippedRect = CGRectMake(self.scrollView.frame.origin.x+90, self.scrollView.frame.origin.y, self.scrollView.frame.size.width-180, self.scrollView.frame.size.height-220); 
CGImageRef imageRef = CGImageCreateWithImageInRect([self.myPhoto CGImage], clippedRect); 
UIImage *newImage = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 

self.imageView.image = newImage; 

également utilisé

- (UIImage *)cropImage:(UIImage *)oldImage { 
    CGSize imageSize = self.cropFrame.frame.size; 
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(imageSize.width, imageSize.height), NO, 0.); 
    [oldImage drawAtPoint:CGPointMake(xPosition, yPosition) 
       blendMode:kCGBlendModeCopy 
        alpha:1.]; 
    UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return croppedImage; 
} 

mais l'image résultat n'est pas l'image exacte selon le cadre de bouton. Je reçois l'image d'un autre endroit.

code mis à jour

- (void)loadPhoto{ 

    CGFloat w = self.myPhoto.size.width; 
    CGFloat h = self.myPhoto.size.height; 
    CGRect imageViewFrame = CGRectMake(0.0f, 0.0f, roundf(w/2.0f), roundf(h/2.0f)); 
    self.scrollView.contentSize = imageViewFrame.size; 

    UIImageView *iv = [[UIImageView alloc] initWithFrame:imageViewFrame]; 
    iv.contentMode = UIViewContentModeScaleAspectFit; 
    iv.image = self.myPhoto; 
    [self.view addSubview:iv]; 
    self.imageView = iv; 
    [iv release];  
} 

CGRect crop;//= CGRectMake(10, 10, 360, 360); 
crop.origin.x = self.cropFrame.frame.origin.x; 
crop.origin.y = self.cropFrame.frame.origin.y; 
crop.size.width = roundf(self.cropFrame.frame.size.width * 2.0f); //self.cropFrame.frame.size.width * 2; 
crop.size.height = roundf(self.cropFrame.frame.size.height * 2.0f); //self.cropFrame.frame.size.height * 2; 

NSLog(@"Rect: %@", NSStringFromCGRect(crop)); 
self.imageView.image = [self croppedImage:crop]; 

- (UIImage *)croppedImage:(CGRect)bounds { 
    CGImageRef imageRef = CGImageCreateWithImageInRect([self.imageView.image CGImage], bounds); 
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:self.myPhoto.imageOrientation]; 
    CGImageRelease(imageRef); 
    return croppedImage; 
} 

S'il vous plaît aider à trouver une solution.

+1

Découvrez [cette catégorie UIImage] (https://github.com/H2CO3/UIImage -Editeur), devrait fonctionner correctement. –

+0

je vous remercie pour ce code, mais toujours son ne fonctionne pas, j'ai mis à jour la question avec le dernier code. J'ai essayé en évitant la vue de défilement, mais toujours aucune aide. – Mithuzz

+0

que voulez-vous dire par "il ne retourne pas l'image réelle"? –

Répondre

0

L'iOS dispose d'une fonction par défaut pour recadrer les images. Essayez ce code.

picker.allowsEditing = YES; 

et également vérifier ce contrôleur pour cropping..this est exactement celui que vous recherchez Je pense https://github.com/barrettj/BJImageCropper .Hope cela vous aide ..

+0

J'ai déjà essayé, ça ne marche pas non plus. – Mithuzz

0

Puisque vous utilisez un ScrollView qui permet à l'image être défilé, vous devez ajuster votre recadrer rect à la position de la position de défilement:

float zoomScale = self.scrollView.zoomScale; 
int cropX = (self.scrollView.contentOffset.x-imageView.frame.origin.x)/zoomScale; 
int cropY = (self.scrollView.contentOffset.y-imageView.frame.origin.y)/zoomScale; 
0

Vous pouvez utiliser cet outil de recadrage que j'ai fait. Il vous donne essentiellement une interface pour permettre à l'utilisateur de sélectionner la zone de recadrage. Je pense que cela correspond à ce que vous cherchez.

https://github.com/nicholjs/BFCropInterface

+0

vous pouvez ajouter deux recadrer dans une seule imageview? –

0

Croyant vous résoudre ce problème. Moi aussi je l'avais quand on essayait la fonctionnalité de recadrage

Définissez image.size comme imageView.size & scrollView.contentSize. Le code ci-dessous donnera le rect à recadrer

cropRect.origin = scrollView.contentOffset; 
cropRect.size = scrollView.bounds.size;  
cropRect.origin.x /= scrollView.zoomScale; 
cropRect.origin.y /= scrollView.zoomScale; 
cropRect.size.width /= scrollView.zoomScale; 
cropRect.size.height /= scrollView.zoomScale; 

Si vous envisagez d'afficher l'image complète en premier sur le rectangle visible. La définition de imageView.size & scrollView.contentSize en taille de vue visible donnera l'image de recadrage d'une autre zone. Au lieu de tenter de trouver l'échelle de zoom par

CGFloat dxWidth = viewCrop.frame.size.width/imageView.image.size.width; 
CGFloat dxHeight = viewCrop.frame.size.height/imageView.image.size.height; 
CGFloat zoomScale = fmaxf(dWidth, dHeight) 

et appliquer (si en ajoutant puis après addSubview sous-vue)

scrollView.minimumZoomScale = zoomScale; // to disable further zoom-out 
[scrollView setZoomScale: zoomScale];