Comment contourner ce bug? -CoreImage: ROI is not tilable-

mouvicielmouviciel Membre
16:31 modifié dans Vos applications #1
Bonjour,

Je travaille sur une application qui manipule et affiche des images en utilisant CoreImage et le filtre "CIAffineTransformFilter". Il arrive dans certaines situations que l'image ne s'affiche pas et que ma console de debug affiche l'erreur suivante "CoreImage: ROI is not tilable". Les recherches sur internet ne m'ont pas donné beaucoup de résultats, juste quelques malheureux qui ont la même erreur que moi avec d'autres filtres, par exemple ici sur ce forum.

Mes différents essais m'ont indiqué que le phénomène se produit avec les grandes images mais avec des paramètres de transformation affine spécifiques à  chaque image (échelle et angle). Le problème semble être plus du côté de CoreImage que de mon application: j'arrive à  le reproduire avec Core Image Fun House.

Pour parler concrètement, voici comment vous pouvez reproduire ce bug:
  • Récupérez l'image suivante: saturn_occultation.jpg. C'est juste histoire d'avoir la même entrée.
  • Chargez-la dans l'application Core Image Fun House (ctrl-clic sur l'image et Ouvrir avec...).
  • Ajoutez un filtre de transformation affine
  • Ouvrez l'application Console et effacez l'écran
  • Réglez l'angle de la transformation affine à  45°


Chez moi, j'obtiens un écran noir et le message suivant:
[tt]29/09/08 21:07:35 [0x0-0x487487].com.apple.CoreImageFunHouse.app[13015] CoreImage: ROI is not tilable:
29/09/08 21:07:35 [0x0-0x487487].com.apple.CoreImageFunHouse.app[13015] AFFINE [0.347072 0.347072 -0.347072 0.347072 0 0] DOD [-833,0 1944x1944]* ROI [174,0 20x1088] RGBA_14
29/09/08 21:07:35 [0x0-0x487487].com.apple.CoreImageFunHouse.app[13015]  APPLY matrix_nobias DOD [0,0 3200x2400] opaque ROI [249,0 1599x1318]
29/09/08 21:07:35 [0x0-0x487487].com.apple.CoreImageFunHouse.app[13015]  RGBA_14
29/09/08 21:07:35 [0x0-0x487487].com.apple.CoreImageFunHouse.app[13015]  APPLY csync_curve0 DOD [0,0 3200x2400] opaque RGBA_14[/tt]

Le contournement évoqué dans le fil dont j'ai parlé (c'est ici) utilise le filtre CICrop. Effectivement, si vous ajoutez un filtre de crop dans l'exemple ci-dessus vous retrouvez l'image initiale (ou du moins une partie selon le crop), pour autant que vous ne choisissiez pas un crop trop haut... Tout cela me suggère d'afficher mon image en plusieurs petits morceaux, mais je ne sais pas a priori combien ni même si cela conviendra à  toutes les images et toutes les situations...

Avez-vous déjà  rencontré ce problème? Avez-vous trouvé une solution? un meilleur contournement? Merci d'avance de vos réponses et commentaires.

Réponses

  • AliGatorAliGator Membre, Modérateur
    16:31 modifié #2
    Je n'ai jamais travaillé avec CoreImage donc la piste ne va peut-être pas être très parlante ou juste, mais juste la petite info au passage si ça peut aider à  cibler le problème :

    - ROI en traitement d'image c'est une abbréviation qui signifie "Region Of Interest". On utilise ce concept en général pour découper l'image en régions au lieu de la traiter dans son ensemble (pour des problèmes de mémoire bien souvent). Ou parce que l'on veut appliquer un filtre que sur une certaine région de l'image (en évitant de créer une sous-image, appliquer le filtre dessus, et réincorporer cette sous-image à  l'image initiale...)

    - Not "tilable" c'est qu'il n'arrive pas à  faire le "pavage", donc sans doute à  découper l'image en ROI ou au contraire à  ré-assembler les ROI traitées en une image correcte.

    Je pense en effet que c'est dû à  CI et non à  ton programme, sans doute à  cause de valeurs particulières induites par la taille de l'image (sa résolution) et les paramètres de la transformation (et donc aussi la taille finale de l'image transformée, voire des ROI qui la composent)
  • Philippe49Philippe49 Membre
    16:31 modifié #3
    dans 1222717753:

    Je n'ai jamais travaillé avec CoreImage donc la piste ne va peut-être pas être très parlante ou juste, mais juste la petite info au passage si ça peut aider à  cibler le problème :

    - ROI en traitement d'image c'est une abbréviation qui signifie "Region Of Interest". On utilise ce concept en général pour découper l'image en régions au lieu de la traiter dans son ensemble (pour des problèmes de mémoire bien souvent). Ou parce que l'on veut appliquer un filtre que sur une certaine région de l'image (en évitant de créer une sous-image, appliquer le filtre dessus, et réincorporer cette sous-image à  l'image initiale...)

    - Not "tilable" c'est qu'il n'arrive pas à  faire le "pavage", donc sans doute à  découper l'image en ROI ou au contraire à  ré-assembler les ROI traitées en une image correcte.

    Je pense en effet que c'est dû à  CI et non à  ton programme, sans doute à  cause de valeurs particulières induites par la taille de l'image (sa résolution) et les paramètres de la transformation (et donc aussi la taille finale de l'image transformée, voire des ROI qui la composent)


    Oui, cela correspond au filtre CICrop. Pour ma part dans le post que cite Mouviciel, j'avais fini par être convaincu que le fait d'avoir à  rajouter ce filtre n'était pas vraiment un bug, simplement une manière de voir les choses : il s'agissait d'un filtre répétant les images à  l'infini, il était donc logique de définir des bornes à  ce filtre. Cela rejoint ce que dit Ali.
  • mouvicielmouviciel Membre
    16:31 modifié #4
    Merci à  vous deux pour vos réponses rapides!

    Tant que je n'ai pas d'autre alternative, j'accepte le fait d'avoir à  découper l'affichage de mes images: avec un découpage en quatre et mes images de test, je n'observe plus le problème.

    Cela dit, il y a quand même un comportement que je ne comprends pas à  propos de taille d'image trop grande: dans mon exemple précédent, si je change l'échelle de 1 à  1.5 alors l'image est de nouveau visible!

    En tout cas, merci encore.
Connectez-vous ou Inscrivez-vous pour répondre.