2015-10-27 2 views
0

J'ai besoin de traiter et stocker les données d'image de PHImageManager aussi efficacement que possible. À cette fin, j'ai besoin d'obtenir chaque image dans l'album photo iOS, de sorte que je puisse le lire à travers un objet CIImage, donc je peux appliquer des filtres et extraire des descripteurs pour une base de données CBIR sur un fil séparé .Comment utiliser les données d'image de PHImageManager

L'utilisation de [PHAsset requestContentEditingInput] pour ouvrir le fichier image par URL n'est pas une option. Cela fonctionne techniquement pour ouvrir le fichier image et le lire, mais j'ai eu de la malchance car cela oblige les rappels dans la file d'attente principale et semble être dépendant de garder les appels dans la file d'attente principale. Il va planter l'application après le traitement de plusieurs images sur une file d'attente d'arrière-plan et je suis à peu près sûr que l'API est faite uniquement pour éditer des sessions qui se produiraient dans la file d'attente principale.

PHImageManager propose une API requestImageDataForAsset pouvant être invoquée de manière synchrone sur un thread d'arrière-plan. Cela semble plus approprié pour une application de traitement d'image qui doit traiter des images sans agir comme un outil d'édition interactif, ce qui est mon cas d'utilisation exact. J'ai aussi besoin de métadonnées, en particulier l'orientation de l'image, que cette API retourne également. Le problème est que je ne peux pas trouver un morceau d'information qui discute réellement cette API. Il dit qu'il retournera un NSData, mais cela ne me dit pas que ce seront les données bitmap RBG, les données JPEG, et d'autres informations utiles. Je veux créer un CIImage avec ces données, mais l'API ne me donne pas de format de pixel, d'espace colorimétrique, ou quoi que ce soit d'autre. Je peux probablement supposer RVB et 3 octets par pixel. Mais cela pourrait probablement être faux.

Est-ce que quelqu'un a utilisé cette API et peut expliquer son comportement? Les vidéos WWDC d'Apple en 2014 n'en parlent même pas vraiment.

Répondre

0

Après avoir bricolé et expérimenté, l'objet NSData renvoyé peut être utilisé pour créer un objet CIImage en utilisant +[CIImage imageWithData:]. Selon la documentation de la méthode, les données doivent être au format JPEG ou TIFF. Il est donc logique que le flux soit l'un d'entre eux.

De plus, il semble y avoir un bug dans iOS 9 qui provoque +[CIImage imageWithContentsOfURL:] de se bloquer si l'image à l'URL est corrompue ou ne peut pas être utilisée pour créer une image.

L'erreur peut être évitée en vérifiant si +[CIImage imageWithData:] renvoie zéro, ce qui suggère que les données d'image à l'URL ne peuvent pas être utilisées pour générer un message CII.