Bild auf Typ prüfen

  • Bild auf Typ prüfen

    Hey Leute,

    ich lade Bilder als NSBitmapImageRep.
    Ich habe bislang keine Methode gefunden, die Bilder auf ihren Typ zu überprüfen.
    Bei mir wäre das JPEG oder TIFF.
    Bislang mache ich das über die Dateiendung, das ist aber nicht sehr elegant.
    Mit [myImg imageFileTypes] geht es nicht, da dies nur mit NSImage geht.

    Jemand eine Idee?
  • Original von Fabian
    Lädst du das Ding aus einer Datei? Datei-Suffixe sind immer eindeutig.

    Gruss,
    Fabian


    nein, sind sie nicht. Eindeutig sind sie eigenlich schon, aber man kann sich nicht auf sie verlassen. Veränder zb mal ein jpg nach gif und die programme öffnen sie trotzdem problemlos. Würden sie das file als gif interpretieren würde es zum fehler kommen. Sie interpretieren es aber nach dem was im header steht!
  • Dann wird auch kein anderes Programm die mehr öffnen können. Wenn du dein .tiff in .jpg änderst kann Vorschau das File auch nicht mehr öffnen. Unter Mac OS X sollte / man davon ausgehen dass die Dateiendungen eindeutig sind (und zwingend vorhanden, wenn eine Datei kein Suffix hat erhält sie dieses schöne graue Dokument-Icon).

    Gruss,
    Fabian
  • also wenn ich meinen avatar hier verwende (ist ein png) und umbenenne in tiff oder jpg oder gif so öffnet es vorschau ohne probleme. Selbst wenn ich die dateiendung entferne kann es vorschau noch öffnen.

    Also vor allem unter OS X sollte man sich NICHT auf dateienedungen verlassen - ist ja nicht Windows!
  • Ich würde die Filterung der Dateitypen nicht selber machen - Du kannst dazu z.B. CFImageSource nehmen:

    Quellcode

    1. NSOpenPanel* panel = [NSOpenPanel openPanel];
    2. int result = [panel runModalForDirectory:[@"~/" stringByExpandingTildeInPath]
    3. file:NULL
    4. types:NULL];
    5. if (result!=NSOKButton) [NSApp terminate:self];
    6. NSString* path = [[panel filenames] objectAtIndex:0];
    7. NSURL* url = [NSURL fileURLWithPath:path];
    8. CGImageSourceRef is = CGImageSourceCreateWithURL((CFURLRef)url,NULL);
    9. if (is) {
    10. CFStringRef uti = CGImageSourceGetType(is);
    11. if (uti) {
    12. NSLog(@"UTI = %@",uti);
    13. if (CFEqual(kUTTypeJPEG,uti)) NSLog(@"It's a JPEG file!");
    14. //Ggf. andere Typen abfragen - UTCoreTypes.h
    15. CFRelease(uti);
    16. } else NSLog(@"Doesn't seem to be a supported image file...");
    17. } else NSLog(@"Doesn't seem to be a supported image file...");
    18. CFRelease(is);
    Alles anzeigen


    Das geht sicherlich noch schöner, aber es scheint zu funktionieren.
    Multigrad - 360°-Produktfotografie für den Mac
  • Dein Code funktioniert leider nicht. BMP-Dateien geben, wenn man ihnen das suffix "jpeg" angibt,
    auch ein jpeg aus.

    Eine mögliche Lösung ist:

    Brainfuck-Quellcode

    1. Der Dateityp läßt sich nur zuverlässig aus den Daten ermitteln, und die haben wir ja:
    2. typedef enum _ImageFileType {
    3. UnknownFileType,
    4. TIFFFileType,
    5. BMPFileType,
    6. GIFFileType,
    7. JPEGFileType,
    8. PNGFileType,
    9. JPEG2000FileType,
    10. PDFFileType,
    11. CIImageFileType,
    12. EPSImageFileType,
    13. PICTFileType
    14. } ImageFileType;
    15. NSData * imageData = [NSData dataWithContentsOfURL: theURL ];
    16. // determine the imageType from the data:
    17. const unsigned char *bytes = [imageData bytes];
    18. //NSLog( @"%02x %02x %02x %02x ", bytes[0], bytes[1], bytes[2], bytes[3] );
    19. BOOL isTIFF_MM = (bytes[0]=='M') && (bytes[1]=='M');
    20. BOOL isTIFF_II = (bytes[0]=='I') && (bytes[1]=='I');
    21. BOOL isJPEG = (bytes[0]==0xff) && (bytes[1]==0xd8) && (bytes[2]==0xff);
    22. BOOL isPNG = (bytes[0]==0x89) && (bytes[1]=='P') && (bytes[2]=='N') && (bytes[3]=='G')
    23. && (bytes[4]==0x0d) && (bytes[5]==0x0a) && (bytes[6]==0x1a) && (bytes[7]==0x0a);
    24. BOOL isGIF = (bytes[0]=='G') && (bytes[1]=='I') && (bytes[2]=='F');
    25. BOOL isPDF = (bytes[0]=='%') && (bytes[1]=='P') && (bytes[2]=='D')
    26. && (bytes[3]=='F') && (bytes[4]=='-');
    27. BOOL isBMP = (bytes[0]=='B') && (bytes[1]=='M');
    28. imageFileType = UnknownFileType;
    29. if( isTIFF_MM ) imageFileType = TIFFFileType;
    30. if( isTIFF_II ) imageFileType = TIFFFileType;
    31. if( isJPEG ) imageFileType = JPEGFileType;
    32. if( isPNG ) imageFileType = PNGFileType;
    33. if( isGIF ) imageFileType = GIFFileType;
    34. if( isPDF ) imageFileType = PDFFileType;
    35. if( isBMP ) imageFileType = BMPFileType;
    36. //NSLog( @"imageFileType %d", imageFileType );
    37. // --------------------------------------------------------------------------
    Alles anzeigen