2015-08-22 7 views
6
lesen

Ich benutze diesen Code (Writing image metadata (EXIF/TIFF/IPTC) to image file in OS X), um EXIF ​​/ TIFF/IPTC-Daten aus Bilddateien zu lesen. Es funktioniert gut, aber ich müsste auch den Beschneidungspfad kopieren. Es wird in einem Nicht-Standard-Index namens "Photoshop" gespeichert (genau wie die anderen Iptc und ähnliche genannt werden).Nicht-Standard-Eigenschaften aus einem Bild in Ziel C

Ich kann nicht herausfinden, wie Sie auf diese Informationen zugreifen, um sie auf ein neu erstelltes NSMage zu kopieren. Die Methode in der Verknüpfung scheint nicht auf nicht standardmäßige Informationen zuzugreifen. Jede Hilfe wird geschätzt. Dank

EDIT ----

Hier ist ein Beispielbild: http://www.mad-sharky.com/clipping_path.jpg

Dieser enthält einen Beschneidungspfad, kann es usign dieses Tool überprüft werden: http://regex.info/exif.cgi können Sie die "Photoshop" finden Sie im Abschnitt . Dieser Teil enthält alle Daten, die ich mit dem von mir verwendeten Code vermisse. (Code ist der gleiche wie der Link oben)

+0

kann zurück leider kommen würden Sie ein Bildbeispiel liefern. (und Ihr Code) und auch sehen Sie tatsächlich die Eigenschaft, wenn Sie NSLOG – markhunte

+0

fertig .. auch eine Bounty! – sharkyenergy

+0

Ich stelle fest, dass diese Website Exiftool verwendet (http://www.sno.phy.queensu.ca/~phil/exiftool/). Was ich zuvor in einer App gebündelt habe und mit NSTask telefonieren konnte. Ich kann die Photoshop-Tag-Liste auf der Exiftool-Site sehen. Aber für das Leben von mir kann sie nicht in Ihrer Datei mit dem Exiftool sehen. ?? – markhunte

Antwort

2

Ich habe nur eine alte .psd-Datei, die keinen Beschneidungspfad hat. Hat aber Schichten.

Dieses kurze Beispielcode verwendet die Photoshop-Bildeigenschaften. kCGImageProperty8BIMDictionary

NSURL *imageFileURL = [NSURL fileURLWithPath:@"https://stackoverflow.com/users/username/foo.psd"]; 
    CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)imageFileURL, NULL); 

    NSDictionary *properties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(imageSource, 0, 
                            NULL); 

    NSDictionary *bim = properties[(__bridge id)kCGImageProperty8BIMDictionary]; 

    NSLog(@"bim %@",bim); 

     CFRelease(imageSource); 

In meinem Bild habe ich einige Bildschichten:

enter image description here

Die NSLog aus dem Code oben zurück

imageRead [11220: 452087] bim { LayerNames = ( "Ebene 0 “ "Layer 5" "Schicht 6" "Schicht 4" "Layer-3" "Layer 2", "Layer 1" ); Version = 1; }

Wenn ich alle Schlüssel wissen wollte, könnte ich verwenden:

id allKeys = [bim allKeys]; 
    NSLog(@"allKeys %@",allKeys); 

Und erhalten:

imageRead [11531: 463848] AllKeys ( Version, Layernamen)

Ich könnte dann verwenden:

id LayerNames = [bim objectForKey:@"LayerNames"]; 
NSLog(@"LayerNames %@",LayerNames); 

zu erhalten:

imageRead [11563: 465657] Layernamen ( "Schicht 0", "Layer 5", "Schicht 6", "Layer 4", „Layer 3" "Layer 2", "Layer 1")

Oder

ValueForKey:, allValues ​​

ich nicht testen kann, wenn ein Beschneidungspfad

+0

aktualisiert den Beitrag mit einem jpg, das einen Beschneidungspfad enthält, und fügte hinzu, Bounty für die Antwort – sharkyenergy

+0

gab Ihnen die Bounty nur nicht wegwerfen .. wenn Sie zufällig eine Lösung finden bitte posten Sie es .. :) danke – sharkyenergy

+0

Ich werde tun, hoffentlich werde ich einen einfacheren Weg finden, diese Felder – markhunte