46

これを機能させるのに十分な調査を行いましたが、修正できませんでした。画像をUIImageとして保存している限り、カメラから写真を撮った後は問題ありませんが、この画像をPNG表現として保存するとすぐに、90度回転します。

以下は私のコードと私が試したすべてのものです:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{
    NSString *mediaType = [info valueForKey:UIImagePickerControllerMediaType];

    if([mediaType isEqualToString:(NSString*)kUTTypeImage]) 
    {
        AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        delegate.originalPhoto  = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
        NSLog(@"Saving photo");
        [self saveImage];
        NSLog(@"Fixing orientation");
        delegate.fixOrientationPhoto  = [self fixOrientation:[UIImage imageWithContentsOfFile:[delegate filePath:imageName]]];      
        NSLog(@"Scaling photo");
        delegate.scaledAndRotatedPhoto  =  [self scaleAndRotateImage:[UIImage imageWithContentsOfFile:[delegate filePath:imageName]]];
    }
    [picker dismissModalViewControllerAnimated:YES];
    [picker release];
}


- (void)saveImage
{
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSData *imageData = UIImagePNGRepresentation(delegate.originalPhoto);
    [imageData writeToFile:[delegate filePath:imageName] atomically:YES];
}

ここで fixOrientation と scaleAndRotateImage 関数はそれぞれherehereから取得されます。UIImage に適用すると正常に機能し、画像を回転させますが、画像を PNG 表現として保存して適用すると機能しません。

上記の機能を実行した後、次の図を参照してください。

最初の写真は元の写真、2 番目は保存された写真、3 番目と 4 番目は保存された画像に fixorientation と scaleandrotate 関数を適用した後のものです。

4

8 に答える 8

73

iOS 4.0 以降では、カメラが写真を撮るときに、保存する前に回転しません。

JPEG の EXIF データに回転フラグを設定するだけです。UIImage を JPEG として保存すると、

回転フラグを設定します.PNGは回転フラグをサポートしていないため、UIImageを

PNG の場合、正しく回転されず、それを修正するためのフラグが設定されていません。PNGが必要な場合は

画像は自分で回転させる必要があります。そのためには、このリンクを確認してください。

于 2012-06-01T12:35:09.767 に答える
3

これを試してください、あなたは使うことができます

NSData *somenewImageData = UIImageJPEGRepresentation(newimg,1.0);

それ以外の

NSData *somenewImageData = UIImagePNGRepresentation(newimg);
于 2017-01-31T05:39:57.443 に答える
1

pls次のコードを試してください

UIImage *sourceImage = ... // Our image
CGRect selectionRect = CGRectMake(100.0, 100.0, 300.0, 400.0);
CGImageRef resultImageRef = CGImageCreateWithImageInRect(sourceImage.CGImage,
selectionRect);
UIImage *resultImage = [[UIImage alloc] initWithCGImage:resultImageRef];

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;
}
}
  ...
UIImage *sourceImage = ... // Our image
 CGRect selectionRect = CGRectMake(100.0, 100.0, 300.0, 400.0);
CGRect transformedRect = TransformCGRectForUIImageOrientation(selectionRect,  sourceImage.imageOrientation, sourceImage.size);
CGImageRef resultImageRef = CGImageCreateWithImageInRect(sourceImage.CGImage, transformedRect);
UIImage *resultImage = [[UIImage alloc] initWithCGImage:resultImageRef];

私は次のリンクから参照しました詳細を探しています

よろしくお願いします :-)

于 2012-06-01T12:40:50.183 に答える
0

このコードを試してください:

NSData *imageData = UIImageJPEGRepresentation(delegate.originalPhoto,100);
于 2015-05-26T12:35:12.173 に答える