2017-01-20 4 views
1

Ceci est un projet de travail. J'ai hérité du code en utilisant SharpDX (une couche DirectX). Une de mes tâches consiste à corriger un morceau de code où certains effets d'image s'appliquent à une forme géométrique contenant un remplissage. Si le filtre est appliqué au remplissage, il ne correspond pas aux bords. J'ai trouvé le code pour extraire un extrait en utilisant la géométrie de l'objet. Pour diverses raisons, ils veulent conserver le remplissage qui existe en dehors de la forme (à savoir, nous avons des effets de distorsion qui tirent les pixels en dehors de la forme), donc j'ai besoin de superposer le tout sur l'arrière-plan. Le problème que je suis en cours d'exécution en est que je reçois cette frontière unique pixel ...Elimination d'un effet de bordure

L'application du filtre Soft Edge à la partie visible
Blurred interior

L'arrière-plan avec la coupe de forme sur
Outside image

les deux composited ensemble dans le programme
Composited

Ce que je veux réellement
What I'm actually getting

Je ne peux pas partager une bonne partie du code, en raison de certaines parties étant propriétaire, mais le masque est un tableau d'octets. Je le construis en utilisant le code suivant:

SingleChannelBitmap mask = new SingleChannelBitmap(MaxRequiredPixels.Width, MaxRequiredPixels.Height, 255); 
mask.FillShape(new RectangleF(new PointF(0,0), mask.Size), this.Geometry, 0); 

255 est la valeur Alpha maximum (transparent). Je l'inverse pour enlever la tranche de l'arrière-plan. La seule chose à laquelle je peux penser est que, quand je fais le masquage, cela n'inclut pas le bord extérieur de la géométrie. Je vais essayer d'agrandir le masque d'un pixel de la manière la plus crue possible (essentiellement, en scannant et en prenant tout ce qui est 0 transparence et en ajoutant un pixel transparent 0 à gauche, droite, haut et bas), mais je sais il doit y avoir une solution plus élégante.

Cela doit également fonctionner pour le filtre de biseautage Edge 3D, donc faire un espace arbitrairement grand ne fonctionnera probablement pas pour moi non plus.

+0

Il est trop difficile de savoir ce que vous faites. Si vous ne pouvez pas inclure de code, alors peut-être une description formelle de vos opérations? –

Répondre

1

Ce que vous décrivez est essentiellement le même problème de haloing qui se produit parfois avec l'affichage des images PNG. Le processus d'exportation PNG de plusieurs programmes va stocker une couleur solide pour toutes les parties du PNG qui a zéro alpha, au lieu de la couleur réelle à ces pixels. Cela leur permet de fonctionner de manière similaire à d'autres formats d'image (GIF) qui utilisent une couleur spécifique pour coder des pixels transparents. Cela réduit considérablement la taille du fichier, cependant, peut causer des problèmes lors de l'échantillonnage de l'image.

Votre situation est similaire. Bien que les pixels masqués aient un alpha nul, lorsque vous effectuez un échantillonnage bilinéaire, vous pouvez échantillonner entre les pixels, en mélangeant à la fois la couleur et les valeurs alpha (à moins que les centres de pixel et de texel ne soient parfaitement alignés). Par exemple, si vous avez un pixel alpha blanc à 100%, un pixel rouge alpha à 0% et un échantillon entre les deux, le résultat sera un pixel rose à 50% alpha.

Il existe plusieurs solutions possibles:

  • On peut étendre les bords de la couche de couleur, de telle sorte que la frontière 0% alpha a la même couleur que les non 0% alpha des pixels adjacents.
  • Aligner intentionnellement les centres de pixel et de texel, bien que cela puisse être compliqué et/ou impossible, en fonction de vos besoins (principalement en fonction de la résolution).
  • Utilisez l'échantillonnage «le plus proche», au lieu de bilinéaire lors de l'affichage de l'image. De cette façon, vous ne fusionnerez jamais dans un pixel alpha à 0%. Toutefois, cela peut également ne pas être souhaitable, car votre image présentera probablement plus d'effets de repliement.