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.
- Aber nach dem Zuschneiden es
, 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.
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; } –
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 –
http: // stackoverflow. com/questions/5427656/ios-uiimagepickercontroller-result-image-orientation-nach-upload Folgen Sie obigen Link – arvind