简体   繁体   中英

Camera image changes orientation

I been trying to upload camera images from iPhone to my web server but some how the images change it's orientation after wards. This only happens with camera images and not simple images uploaded to device from my machine.

Below is the code:

    NSData *imgdataRepresentation = UIImageJPEGRepresentation(imgTemp, 0.5);


    ///////**********************************************
    // setting up the URL to post to
    NSString *addPhotoURL = [NSString stringWithFormat:@"%@%@%@",HTTP_HOST,ADD_PHOTO_URL,[userInfo.userDetail objectForKey:@"id"]];

    // setting up the request object now
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
    [request setURL:[NSURL URLWithString:addPhotoURL]];
    [request setHTTPMethod:@"POST"];

    /*
     add some header info now
     we always need a boundary when we post a file
     also we need to set the content type

     You might want to generate a random boundary.. this is just the same
     as my output from wireshark on a valid html post
     */
    NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];

    /*
     now lets create the body of the post
     */
    NSMutableData *body = [NSMutableData data];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"Album\"; filename=\"ipodfile.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imgdataRepresentation ]];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    // setting the body of the post to the reqeust
    [request setHTTPBody:body];

    // now lets make the connection to the web
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

iPhone images are always stored the same way regardless of how the phone is held, but a flag is set in the EXIF data that specifies which orientation the image should be in. Almost all native OSX applications such as iPhoto and Preview can read this EXIF orientation tag correctly and rotates the image automatically, but almost all Windows applications and web browsers don't take the orientation EXIF tag into account. You'll have to manually rotate the image on the web server before saving it. I don't know which web server technology you use, but the C# code to do this is:

public static void FixOrientation(this Image image)
{
    // 0x0112 is the EXIF byte address for the orientation tag
    if (!image.PropertyIdList.Contains(0x0112))
    {
        return;
    }

    // get the first byte from the orientation tag and convert it to an integer
    var orientationNumber = image.GetPropertyItem(0x0112).Value[0];

    switch (orientationNumber)
    {
        // up is pointing to the right
        case 8:
            image.RotateFlip(RotateFlipType.Rotate270FlipNone);
            break;
        // up is pointing to the bottom (image is upside-down)
        case 3:
            image.RotateFlip(RotateFlipType.Rotate180FlipNone);
            break;
        // up is pointing to the left
        case 6:
            image.RotateFlip(RotateFlipType.Rotate90FlipNone);
            break;
        // up is pointing up (correct orientation)
        case 1:
            break;
    }
}

You can get the image orientation of a UIImage by using the imageOrientation method. So for example, you want to save the image taken from the camera you can do:

UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
if (image) {
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library writeImageToSavedPhotosAlbum:[image CGImage] 
                              orientation:[image imageOrientation]
                          completionBlock:^(NSURL *assetURL, NSError *error){ /* error handling */ }];
    [library autorelease];
}

and then when you want to get the UIImage from the library you can retrieve the orientation by doing something like:

UIImage *image = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage] scale:1.0 orientation:[asset orientation]]; 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM