4 Stimmen

Kamerabild ändert Ausrichtung

Ich habe versucht, Kamerabilder vom iPhone auf meinen Webserver hochzuladen, aber irgendwie ändern die Bilder danach ihre Ausrichtung. Dies geschieht nur mit Kamerabildern und nicht einfach Bilder auf das Gerät von meinem Rechner hochgeladen.

Nachstehend finden Sie den 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];

22voto

Daniel T. Punkte 35346

IPhone-Bilder werden immer auf die gleiche Weise gespeichert, unabhängig davon, wie das Telefon gehalten wird. In den EXIF-Daten wird jedoch eine Markierung gesetzt, die angibt, in welcher Ausrichtung das Bild angezeigt werden soll. Fast alle nativen OSX-Programme wie iPhoto und Vorschau können dieses EXIF-Ausrichtungs-Tag korrekt lesen und drehen das Bild automatisch, aber fast alle Windows-Programme und Webbrowser berücksichtigen das EXIF-Tag für die Ausrichtung nicht. Sie müssen das Bild manuell auf dem Webserver drehen, bevor Sie es speichern. Ich weiß nicht, welche Webserver-Technologie Sie verwenden, aber der C#-Code dazu lautet:

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

3voto

calampunay Punkte 108

Sie können die Bildausrichtung eines UIImage mit der Methode imageOrientation ermitteln. Wenn Sie zum Beispiel das von der Kamera aufgenommene Bild speichern möchten, können Sie dies tun:

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 das UIImage aus der Bibliothek abrufen möchten, können Sie die Ausrichtung abrufen, indem Sie etwas wie tun:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X