2010-12-30 12 views
4

Ich habe versucht, Kamerabilder vom iPhone auf meinen Webserver zu laden, aber einige, wie die Bilder ihre Ausrichtung nach den Wards ändern. Dies geschieht nur bei Kamerabildern und nicht bei einfachen Bildern, die von meinem Gerät auf das Gerät hochgeladen werden.Kamerabild ändert die Ausrichtung

Unten ist der 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]; 

Antwort

20

iPhone Bilder auf die gleiche Weise immer gespeichert werden, unabhängig davon, wie das Telefon gehalten wird, aber ein Flag in den EXIF-Daten festgelegt, die in der Orientierung gibt sollte das Bild sein Nahezu alle nativen OSX-Anwendungen wie iPhoto und Preview können dieses EXIF-Orientierungs-Tag korrekt lesen und das Bild automatisch drehen, aber fast alle Windows-Anwendungen und Web-Browser berücksichtigen das EXIF-Tag für die Ausrichtung nicht. Sie müssen das Bild auf dem Webserver manuell drehen, bevor Sie es speichern. Ich weiß nicht, welche Web-Server-Technologie Sie verwenden, aber der C# -Code, dies zu tun ist:

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; 
    } 
} 
+0

Danke für schnelle Antwort Mann. Ich benutze PHP, aber jetzt ist das Problem, wie ich zwischen Kamerabildern und Bildern, die von meinem Desktop zu meinem Gerät hinzugefügt werden, aufpassen werde. – prabh

+0

Das ist ziemlich einfach, und mein C# -Code ist dafür verantwortlich. Wenn das EXIF-Orientierungs-Tag existiert, drehen Sie das Bild entsprechend der Orientierungs-Tag-Information. Ansonsten nichts tun. –

+0

Ich kenne selbst kein PHP, aber ich fand das mit einer schnellen Google-Suche: http://bytes.com/topic/php/answers/641481-thumbnail-orientation –

3

Sie die Bildausrichtung eines UIImage unter Verwendung der imageOrientation Methode erhalten können. So zum Beispiel, wollen Sie das Bild von der Kamera aufgenommen speichern Sie tun können:

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]; 
} 

und dann, wenn Sie die UIImage erhalten möchten aus der Bibliothek Sie die Ausrichtung abrufen kann so etwas wie, indem Sie:

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