Frage

Ich habe ein seltsames Problem mit Capturestillimageasynchron. Wenn ich das Bild mit jpegstillimagensDatArepresentation speichere, während das Video gespiegelt wird, wird das Bild in der Kamerarolle im Uhrzeigersinn um 90 Grad gedreht. Wenn es jedoch nicht gespiegelt ist, ist die Orientierung in Ordnung. Ich werde den Code veröffentlichen, sonst hat jemand dieses Problem/kennt eine Fix?

Update: Nur einige Tests, die Höhen und Breiten (640x480) sind in Ordnung und spiegeln die Ausrichtung des Geräts wider. Wenn ich ein Foto im Porträt mache, meldet es UIImageOrentationLeft und wenn ich spiegelt, uiimageorientationLeftmirrored.

UPDATE 2: Wenn ich das gespeicherte Foto in der Kamera -Rolle ansehe, hat die Vorschau des Bildes die richtige Ausrichtung, ebenso wie das Bild, wenn Sie zwischen Fotos wischen. Wenn das Foto jedoch voll geladen ist, dreht es sich um 90 Grad. Könnte dies ein Problem mit Kamerarollen sein? (Ich bin auf 4.3.3)

- (void) captureImageAndSaveToCameraRoll
{
    AVCaptureConnection *stillImageConnection = [AVCamUtilities connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self stillImageOutput] connections]];
    if ([stillImageConnection isVideoOrientationSupported])
        [stillImageConnection setVideoOrientation:[self orientation]];

    [[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:stillImageConnection
                                                         completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {

                                                             ALAssetsLibraryWriteImageCompletionBlock completionBlock = ^(NSURL *assetURL, NSError *error) {
                                                                 if (error) {
                                                                     if ([[self delegate] respondsToSelector:@selector(captureManager:didFailWithError:)]) {
                                                                         [[self delegate] captureManager:self didFailWithError:error];
                                                                     }
                                                                 }
                                                             };

                                                             if (imageDataSampleBuffer != NULL) {
                                                                 NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
                                                                 ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

                                                                 UIImage *image = [[UIImage alloc] initWithData:imageData];
                                                                 [library writeImageToSavedPhotosAlbum:[image CGImage]
                                                                                           orientation:(ALAssetOrientation)[image imageOrientation]
                                                                                       completionBlock:completionBlock];
                                                                 [image release];

                                                                 [library release];
                                                             }
                                                             else
                                                                 completionBlock(nil, error);

                                                             if ([[self delegate] respondsToSelector:@selector(captureManagerStillImageCaptured:)]) {
                                                                 [[self delegate] captureManagerStillImageCaptured:self];
                                                             }
                                                         }];
}
War es hilfreich?

Lösung

Ich frage mich, ob Sie das neu erstellte Bild wirklich über seine Orientierungs -Set haben, wie Sie hier annehmen:

[library writeImageToSavedPhotosAlbum:[image CGImage] orientation: (ALAssetOrientation) [image imageOrientation] completionBlock:completionBlock];

[image imageOrientation] Insbesondere scheint potenziell die Quelle des Problems zu sein, insbesondere bei der erforderlichen Besetzung ...

Sie sagen, Sie sehen die Bildorientierung irgendwo, ist es aus [image imageOrientation] Kurz nach dem Erstellen mit:

NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation: imageDataSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];

Ich frage mich, ob Sie davon ausgehen, dass diese Metadaten in der sind imageData zurückgekehrt von AVCaptureStillImageOutput jpegStillImageNSDataRepresentation: Wenn das tatsächlich nur die Bildpixeldaten selbst enthält?

Andere Tipps

Entsprechend einige Berichte, Die Fotosanwendung des iPhone im Jahr 2009 unterstützte überhaupt keine der gespiegelten Orientierungen. Es ist sicherlich möglich, dass sie dies teilweise behoben haben, aber in einigen Fällen immer noch Fehler haben (ich weiß beispielsweise, dass UIImageView nicht behandelt wird contentStretch korrekt in einigen Fällen). Dies sollte leicht genug zu testen sein: Laden Sie einfach die Beispielbilder aus diesem Blog in die Kamera -Rolle und sehen Sie, was passiert.

Erstellen Sie die Kategorie für in der UIImage beschriebene in iOS UIImagePickerController -Ergebnisbild Ausrichtung nach dem Upload

Rufen Sie diese Methode auf dem Bild auf, bevor Sie sie in Ihrer Bibliothek speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top