2016-12-01 6 views
2

Ich habe Probleme mit der Bildrotation nach dem Zuschneiden Bild. Ich habe Schritt für Schritt Methoden unter denen ich derzeit verwendet habe.Bild von benutzerdefinierten Kamera erfasst wird nach dem Zuschneiden gedreht iOS

Hier ist der Prozess i gefolgt Ergebnis zu erhalten:

Schritt: 1 Foto aufnehmen durch individuelle Kamera

- (void)captureImageWithCompletionHander:(void (^)(id))completionHandler{ 
    [_cameraOverlayView hideHightLightOverlay]; 
    if (_isCapturing) return; 

    __weak typeof(self) weakSelf = self; 
    [weakSelf hideGLKView:YES completion:^{ 
     [weakSelf hideGLKView:NO completion:^{ 
      [weakSelf hideGLKView:YES completion:nil]; 
     }]; 
    }]; 
    _isCapturing = YES; 

    AVCaptureConnection *videoConnection = nil; 
    for (AVCaptureConnection *connection in self.stillImageOutput.connections){ 
     for (AVCaptureInputPort *port in [connection inputPorts]){ 
      if ([[port mediaType] isEqual:AVMediaTypeVideo]){ 
       videoConnection = connection; 
       break; 
      } 
     } 
     if (videoConnection) break; 
    } 

    [self.stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error){ 
     if(!CMSampleBufferIsValid(imageSampleBuffer)){ 
      return; 
     } 
     NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; 

     UIImage * capturedImage = [[UIImage alloc]initWithData:imageData scale:1]; 
     NSLog(@"%lu",(unsigned long)UIImageJPEGRepresentation(capturedImage, 1.0).length); 
     if (_myDevice == [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo][0]) { 
      capturedImage = capturedImage; 
     }else if (_myDevice == [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo][1]) { 
     } 

     [weakSelf hideGLKView:NO completion:nil]; 
     completionHandler(capturedImage); 
     _isCapturing = NO; 
    }]; 
} 

Schritt: 2 Fix Orientierung

-(id)initWithImage:(UIImage*) image{ 
    self = [super init]; 
    if (self){ 
     self.originalImage = [image fixOrientation]; 
    } 

    return self; 
} 

//Method for fix orientation 
@implementation UIImage (fixOrientation) 

- (UIImage *)fixOrientation { 

    // No-op if the orientation is already correct 
    if (self.imageOrientation == UIImageOrientationUp) return self; 

    // We need to calculate the proper transformation to make the image upright. 
    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. 
    CGAffineTransform transform = CGAffineTransformIdentity; 

    switch (self.imageOrientation) { 
     case UIImageOrientationDown: 
     case UIImageOrientationDownMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height); 
      transform = CGAffineTransformRotate(transform, M_PI); 
      break; 

     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.width, 0); 
      transform = CGAffineTransformRotate(transform, M_PI_2); 
      break; 

     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 
      transform = CGAffineTransformTranslate(transform, 0, self.size.height); 
      transform = CGAffineTransformRotate(transform, -M_PI_2); 
      break; 
     case UIImageOrientationUp: 
     case UIImageOrientationUpMirrored: 
      break; 
    } 

    switch (self.imageOrientation) { 
     case UIImageOrientationUpMirrored: 
     case UIImageOrientationDownMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.width, 0); 
      transform = CGAffineTransformScale(transform, -1, 1); 
      break; 

     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRightMirrored: 
      transform = CGAffineTransformTranslate(transform, self.size.height, 0); 
      transform = CGAffineTransformScale(transform, -1, 1); 
      break; 
     case UIImageOrientationUp: 
     case UIImageOrientationDown: 
     case UIImageOrientationLeft: 
     case UIImageOrientationRight: 
      break; 
    } 

    // Now we draw the underlying CGImage into a new context, applying the transform 
    // calculated above. 
    CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height, 
              CGImageGetBitsPerComponent(self.CGImage), 0, 
              CGImageGetColorSpace(self.CGImage), 
              CGImageGetBitmapInfo(self.CGImage)); 
    CGContextConcatCTM(ctx, transform); 
    switch (self.imageOrientation) { 
     case UIImageOrientationLeft: 
     case UIImageOrientationLeftMirrored: 
     case UIImageOrientationRight: 
     case UIImageOrientationRightMirrored: 
      // Grr... 
      CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage); 
      break; 

     default: 
      CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage); 
      break; 
    } 

    // And now we just create a new UIImage from the drawing context 
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx); 
    UIImage *img = [UIImage imageWithCGImage:cgimg]; 
    CGContextRelease(ctx); 
    CGImageRelease(cgimg); 
    return img; 
} 
@end 

Schritt: 3 Crop Bild

-(UIImage *)cropImage:(UIImage *)image{ 
    CGFloat overlayHeight = self.frame.size.height; 
    UIImageOrientation originalOrientation = image.imageOrientation; 
    CGFloat originalScale = image.scale; 
    CIImage *rawImage = [CIImage imageWithCGImage:image.CGImage]; 

    NSMutableDictionary *rectangleCoordinates = [NSMutableDictionary new]; 
    rectangleCoordinates[@"inputTopLeft"] = [CIVector vectorWithCGPoint:CGPointMake(topLeftPath.x * _absoluteWidth, (overlayHeight - topLeftPath.y) * _absoluteHeight)]; 
    rectangleCoordinates[@"inputTopRight"] = [CIVector vectorWithCGPoint:CGPointMake(topRightPath.x * _absoluteWidth, (overlayHeight - topRightPath.y) * _absoluteHeight)]; 
    rectangleCoordinates[@"inputBottomLeft"] = [CIVector vectorWithCGPoint:CGPointMake(bottomLeftPath.x * _absoluteWidth, (overlayHeight - bottomLeftPath.y) * _absoluteHeight)]; 
    rectangleCoordinates[@"inputBottomRight"] = [CIVector vectorWithCGPoint:CGPointMake(bottomRightPath.x * _absoluteWidth, (overlayHeight - bottomRightPath.y) * _absoluteHeight)]; 
    rawImage = [rawImage imageByApplyingFilter:@"CIPerspectiveCorrection" withInputParameters:rectangleCoordinates]; 

    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef cgImage = [context createCGImage:rawImage fromRect:[rawImage extent]]; 
    UIImage *RImage = [UIImage imageWithCGImage:cgImage scale:originalScale orientation:originalOrientation]; 
    return RImage; 
} 

Ergebnis:

  • Nach Bildaufnahme i Originalbild zeigte, & sieht es gerade. Keine Probleme.

Siehe Bild: enter image description here

  • Aber nach dem Zuschneiden es

Siehe Bild gedreht wird: enter image description here

Einige Referenzen

, die ich schon versucht, aber nicht funktioniert:

Using CoreImage to filter an image results in image rotation

iOS UIImagePickerController result image orientation after upload

iOS - UIImageView - how to handle UIImage image orientation

How to get the Correct orientation of the image selected from the Default Image gallery

Convert a UIImage to a CIImage to crop to a CGRect. AVFoundation

Es wird großartig sein, wenn jemand zu führen, dieses Problem zu lösen.

Vielen Dank im Voraus.

+0

dies versuchen, für croping .. - (UIImage *) Ernte: (CGRect) rect { rect = CGRectMake (rect.origin.x * self.scale, rect.origin.y * self.scale, rect .size.width * self.scale, rect.size.height * self.scale); CGImageRef imageRef = CGImageCreateWithImageInRect ([Selbst-CGImage], rect); UIImage * Ergebnis = [UIImage imageWithCGImage: imageRef Maßstab: self.scale Orientierung: self.imageOrientation]; CGImageRelease (imageRef); Ergebnis zurückgeben; } –

+0

ich denke, dass Sie diese Antwort für das Zuschneiden des Bildes verweisen sollten, verwende ich diese Antwort in meinem Projekt und löse mein prorblem .. http://stackoverflow.com/questions/158914/cropping-an-uiimage –

+0

http: // stackoverflow. com/questions/5427656/ios-uiimagepickercontroller-result-image-orientation-nach-upload Folgen Sie obigen Link – arvind

Antwort

0

Nach so vielen Versuchen & so viele Lösungen versucht, schließlich aufgelöst ich es von zu UIBeizerPath bewegen.

Ich bemerkte, dass das Orientierungsproblem nur wegen CIImage kam, die nie gelöst werden. Selbst ein Originalbild wurde korrekt, es wurde nach dem Zuschneiden nur wegen CIImage gedreht.

So versuchte mit UIBeizerPath & hier ist das, was ich tat:

UIBezierPath *path = [_overlayView getPath]; 
CGRect rect = CGRectZero; 
rect.size = _detectedImage.frame.size; 

CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
shapeLayer.frame = CGRectMake(0, 0, _detectedImage.frame.size.width, _detectedImage.frame.size.height); 
shapeLayer.path = path.CGPath; 
shapeLayer.fillColor = [[UIColor whiteColor] CGColor]; 
shapeLayer.backgroundColor = [[UIColor clearColor] CGColor]; 
[_detectedImage.layer setMask:shapeLayer]; 

UIGraphicsBeginImageContextWithOptions(_detectedImage.layer.frame.size, NO, 0); 
[_detectedImage.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIImage *cpImage = [outputImage imageByTrimmingTransparentPixelsRequiringFullOpacity:YES]; 
UIGraphicsEndImageContext(); 

Hoffe, dass es jemand helfen.

1

Ersetzen Sie einfach Ausrichtung zu UIImageOrientationUp in der folgenden Zeile in Ihrer "cropImage" -Methode.

UIImage *RImage = [UIImage imageWithCGImage:cgImage scale:originalScale orientation:UIImageOrientationUp]; 
+0

versuchte es aber nicht funktioniert – Mayur

Verwandte Themen