Jestem nowicjuszem dla iOS i walczyłem o ścianę, szukając tego w zeszłym tygodniu, szukając w Internecie tutoriali takich jak: Dealing with Exif Images, Resizing images, i wielu więcej losowych pytań tutaj na StackOverflow. Z tego wywnioskowałem, że wszystkie obrazy zrobione z kamery zawierają informacje o rotacji oparte na EXIF
.iOS: Kadrowanie obrazu nieruchomego pobranego z kamery UIImagePickerController z nakładką
Co nie działa: Po wypróbowaniu różnych technik kadrowanie obrazu, wszystko skończyć z jest kadrowanie obrazu w niektórych losowych narożników, a także, powstały obraz wydaje się być powiększony :(Kiedy używam png
wizerunek z Internetu (które nie zawierają danych EXIF), przycinanie działa, przez przypadkowe rogi, mam na myśli - obraz kończy się obcięcie w prawym górnym i lewym górnym rogu i powiększenie obrazu.
Co próbuję wykonać: Próbuję przyciąć obraz 100 px
od góry i 100 px
od dołu. Zasadniczo używam dwóch nakładek - 1 u góry i 1 u dołu z wysokim pasem na górze] i innym CGRect(0.0, SCREEN_HEIGHT - 100, SCREEN_WIDTH, 100.0)
[innym 100 px
wysokim paskiem u dołu]. Muszę uzyskać obraz między tymi dwoma paskami: Zakładam, że wysokość obrazu to: SCREEN_HEIGHT - 200.0
.
Wyświetlanie UIImagePickerController dla kamery z nakładką:
//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];
Kodeksu aby obrócić obraz na podstawie EXIF imageOrientation
nieruchomości i przycinanie jej
- (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;
}
Sposób cropImage
wydaje się działać dla obrazów pobranych z internetu (które nie zawierają żadnych informacji o orientacji). Kończą mi się opcje. Czy ktoś mógłby mi pomóc?
Dzięki za przeczytanie!
Sagar - czy poniższa metoda nie powoduje aplikacja do upadku? – Dejell
@Odelya do której z poniższych metod się odwołujesz? –
Odpowiedź od Matt. Mam dokładny problem i przez miesiąc nie udało mi się go prawidłowo przyciąć. – Dejell