2012-04-30 3 views
5

Ich habe eine Reihe von Bilddateien in einem proprietären Binärformat, die ich in NSImages laden möchte. Das Format ist keine einfache Bitmap, sondern eine Art RLE-Darstellung, gemischt mit Transparenz und diversen Zusatzinformationen.Empfohlener Ansatz zum Laden einer proprietären Binärbilddatei in NSImage?

Um eines dieser Bilder in einer Cocoa-App anzuzeigen, brauche ich eine Möglichkeit, die Bilddatei byteweise zu parsen und eine Bitmap daraus zu "berechnen", die ich dann in ein NSMage einfügen werde.

Was ist ein guter Ansatz dafür in Objective-C/Cocoa?

Antwort

7

Die Aufgaben der Interpretation von Bilddaten werden von den Darstellungsobjekten des Bildes übernommen. Um ein proprietäres Format zu verwenden, haben Sie einige Optionen: (a) erstellen Sie eine benutzerdefinierte Darstellungsklasse, (b) verwenden Sie mit einem benutzerdefinierten Delegaten, oder (c) verwenden Sie ein benutzerdefiniertes Objekt, um Ihr Bild in ein unterstütztes Format zu konvertieren eine rohe Bitmap. Wenn Sie eine benutzerdefinierte Darstellungsklasse erstellen, erstellen Sie eine Unterklasse von NSImageRep, wie in Creating New Image Representation Classes beschrieben. Dies erfordert grundsätzlich, dass sich Ihre Klasse selbst registriert und in der Lage ist, die Bilddaten zu zeichnen. Darüber hinaus können Sie Methoden überschreiben, um Informationen über das Bild zurückzugeben, und Sie können Ihre Bilder mit den normalen Methoden NSImage instanziieren. Diese Methode erfordert die meiste Arbeit.

Die Verwendung von NSCustomImageRep erfordert weniger Arbeit als das Erstellen einer benutzerdefinierten Implementierung. Ihr Delegat-Objekt muss nur in der Lage sein, das Bild an einem festen Ort zu zeichnen. Sie können jedoch keine anderen Informationen über das Bild zurückgeben, und Sie müssen das Objekt NSCustomImageRep manuell erstellen, bevor Sie das NSImage erstellen.

Das Übersetzen des Bildes in ein anderes Format ist auch einfacher als das Erstellen einer benutzerdefinierten Darstellung. Es könnte so einfach sein, wie eine leere NSImage der richtigen Größe zu erstellen und hinein zu zeichnen. Das Erstellen des Bildes ist noch komplizierter, da Sie Ihre Übersetzungsmethode aufrufen müssen, was sich auf die Effizienz (sowohl die zukünftige Zeichnungszeit als auch die Speichernutzung) auswirkt, da Sie Formate ändern, die gut oder schlecht sein können. Sie verlieren auch jegliche Assoziation zwischen dem Bildobjekt und seiner Quelle.

+0

Schöne Zusammenfassung der verfügbaren Optionen, danke! Was die dritte Option betrifft: Ich müsste die Konvertierung nur einmal vornehmen, wenn ich den 'NSMageage' erzeuge, oder? Wie würde dies die zukünftige Zeichnungszeit beeinflussen? Und was ist der effizienteste Weg, um ein 'NSImage' zu ​​erstellen? Ich habe irgendwo über eine Lösung gelesen, bei der jedes Mal ein 'NSColor'-Objekt erstellt wurde, wenn ein Pixel geschrieben wurde. Das scheint nicht so effizient zu sein, da ich mehrere hundert Megabyte Bilddaten verarbeiten muss. – tajmahal

+0

@tajmahal Ja, du würdest die Zeichnung nur einmal machen. Zukünftig würde das Zeichnen in dem Format erfolgen, in das Sie konvertiert haben, und das würde wahrscheinlich so schnell wie möglich sein, wenn Sie nur in das Bild zeichnen. Wenn Ihr Format ein Bitmap-Format ist, können Sie es "zeichnen", indem Sie es in ein Bitmap-Format ändern, das "NSImage" unterstützt, anstatt Farbobjekte zu erstellen und einzelne Pixel zu zeichnen. Wenn es sich bei Ihrem Format um ein Vektorformat handelt, sollten Sie die Zeichenmethoden Cocoa oder Core Graphics verwenden, um es zu zeichnen. CG verfügt auch über Schattierungsobjekte, mit denen Sie die Farbe für jeden Pixel über eine Funktion bereitstellen können. – ughoavgfhw

Verwandte Themen