2009-07-24 6 views

Répondre

3

CreateDIBSection. Remplissez le BITMAPINFOHEADER avec 32bpp. Remplissez le canal alpha avec alpha pré-multiplié et vous êtes prêt à partir. AlphaBlend est l'API qui bloque en fait 32 bits binaires avec un canal aplha.

0

Vous pouvez le faire en C# en utilisant la méthode LockBits de la classe BitMap (voir this question pour une explication). Vous ne voulez certainement pas utiliser GetPixel et SetPixel pour cela, car ils sont horriblement lents (même si vous ne manipulez que les bords et pas tout le bitmap).

+0

Malheureusement, je n'utilise pas de langage géré. Je vais devoir utiliser des API Windows vanilles. – wkf

+0

C'est faisable, mais pas par moi. =) – MusiGenesis

-1

Il n'y a pas de moyen facile de faire un tel dessin avec seulement des appels GDI. Ce que vous voulez, ce n'est pas seulement l'alpha-blending: vous voulez un anti-aliasing. Cela implique généralement de dessiner ce que vous voulez à une résolution plus grande et de réduire ensuite. Ce que j'ai fait dans le passé pour des problèmes similaires est d'utiliser un programme artistique pour dessiner n'importe quelle forme que je veux (par exemple un coin arrondi) beaucoup plus grande que nécessaire en noir et blanc. Quand je voulais le dessiner, je mettais à l'échelle le bitmap en noir et blanc à la taille que je voulais (en utilisant une variante de scaling class from Code Project). Cela me donne une image en niveaux de gris que je peux utiliser comme canal alpha, que j'utiliserais ensuite pour l'alpha blending, soit en appelant la fonction Win32 AlphaBlend, soit en utilisant une DIBSection et en changeant manuellement les pixels appropriés. Une autre variante de cette approche consisterait à allouer une DIBSection environ quatre fois plus grande que celle que vous vouliez obtenir au résultat final, puis à utiliser la classe d'échelle ci-dessus pour la réduire: la mise à l'échelle d'une image plus grande donnera l'effet de lissage approprié.

Si tout cela ressemble à beaucoup de travail: eh bien, c'est.

EDIT: Pour répondre au titre de cette question: vous pouvez créer un bitmap avec un canal alpha en appelant CreateDIBSection. Cela ne suffira pas à faire ce que vous voulez, je pense.

+0

Je suis tombé sur CreateDIBSection en parcourant MSDN cet après-midi, et il semble que ce soit la pièce qui me manquait. J'utilise les algorithmes ligne/cercle de Wu pour dessiner des lignes et des cercles anti-aliasés; aussi longtemps que j'ai accès aux données de pixels réels, je peux le définir à tout ce que je veux. Et tu as raison; il s'avère être beaucoup de travail! ; p – wkf

+0

Il semble que vous êtes fondamentalement là. Les sections DIB sont idéales pour le travail graphique: vous obtenez un handle HBITMAP, mais vous pouvez également accéder aux données de pixel brut. – DavidK

+0

L'anti-crénelage ne se réduit pas, il ajoute des pixels d'ombrage supplémentaires autour des bords diagonaux ou courbes pour lui donner une apparence plus lisse. Cela fonctionne BEAUCOUP mieux si vos pixels ajoutés ont un composant alpha (c'est-à-dire qu'ils utilisent un mélange alpha). – Eric

0

Une chance d'utiliser GDI+ au lieu de GDI? Il prend en charge antialiasing et la transparence dès la sortie de la boîte.

+0

Si j'utilisais GDI +, je serais coincé avec les API plates, qui semblent moins conviviales. Bien que si GDI + rende mon travail plus facile, je serais tenté de passer à quelque chose de plus «convivial». Je vais vérifier ça. Merci! – wkf

+0

J'ai aussi le problème des lignes dentelées et j'utilise GDI + quand je fais un 'CImage :: AlphaBlend' – sergiol

+0

@sergiol il n'y a pas assez d'informations dans cette déclaration pour vous aider. Je suggère d'ouvrir une nouvelle question. –

Questions connexes