Wie erstelle ich ein gültiges CGImageSourceRef aus einer ALAssetRepresentation?

8

Ich versuche, CGImageSourceCreateThumbnailAtIndex zu verwenden, um eine skalierte Version eines Bildes effizient zu erstellen. Ich habe etwas vorhandenen Code, der dies mit Bildern von der Platte tut, und jetzt versuche ich, ein Bild zu verwenden, das von ALAssetsLibrary kommt.

Hier ist mein Code:

%Vor%

Das Problem ist, dass resizedImage null ist und CGImageSourceGetCount(sourceRef) 0 zurückgibt. Der Datenprovider tut jedoch ziemlich viele Daten und die Daten scheinen gültig zu sein Bilddaten. Der ALAsset kommt von einer iPhone 4S-Kamerarolle.

Was vermisse ich? Warum erstellt CGImageSourceCreateWithDataProvider() eine Bildquelle mit 0 Bildern?

    
BJ Homer 26.06.2013, 22:49
quelle

4 Antworten

4

CGImageSource dient zum Deserialisieren von serialisierten Bildern, wie JPEGs, PNGs und so weiter.

CGImageGetDataProvider gibt (den Anbieter von) die rohen Pixeldaten des Bildes zurück. Es gibt serialisierte Bytes in einem externen Format nicht zurück. CGImageSource hat keine Möglichkeit zu wissen, welches Pixelformat (Farbraum, Bit pro Komponente, Alpha-Layout usw.) in den Rohpixeldaten enthalten ist.

Sie könnten versuchen, die URL des Asset-Reps abzurufen und diese an CGImageSourceCreateWithURL zu übergeben. Wenn das nicht funktioniert (z. B. keine Datei-URL), müssen Sie das Image über ein CGImageDestination ausführen und eine CGImageSource erstellen, wo immer Sie die Ausgabe platzieren.

(Die andere Sache, die wir versuchen sollten, wäre zu sehen, ob der filename des Repräsentanten tatsächlich ein vollständiger Pfad ist, wie Cocoa den Begriff oft missbraucht. Aber Sie sollten sich wahrscheinlich nicht darauf verlassen.)

    
Peter Hosey 26.06.2013, 23:59
quelle
2

Eine Sache, die Sie ausprobieren könnten, ist die Methode CGImageWithOptions: des Ressourcenvertreters% .

Die Dokumentation behauptet , dass:

  

Diese Methode gibt die größte, beste verfügbare Darstellung zurück, die in keiner Weise eingestellt ist.

Aber es steht auch über fullResolutionImage , und ich bin mir nicht sicher, warum diese Klasse beide Methoden hätte, wenn sie beide dasselbe machen. Ich frage mich, ob es ein Copy-and-Paste-Fehler ist.

Probieren Sie CGImageWithOptions: mit einer Reihe von Optionen zur Erstellung von Thumbnails aus und sehen Sie, was passiert.

    
Peter Hosey 27.06.2013 00:00
quelle
1

Option # 3 wäre die fullScreenImage des Repräsentanten. Je nachdem, welche Art von "Miniaturbild" Sie benötigen, ist es möglicherweise billiger und / oder einfacher, nur dieses zu verwenden, das nicht größer als (ungefähr) die Größe des Bildschirms des Geräts ist.

    
Peter Hosey 27.06.2013 00:02
quelle
0

Das kann auch helfen ...

%Vor%     
Himanshu Kapoor 29.03.2015 16:27
quelle