J'utilise des fenêtres en couches et dessine un rectangle arrondi sur l'écran. Cependant, je voudrais lisser les bords dentelés. Je pense que j'aurai besoin d'un alpha-blending pour ça. Est-ce que je peux faire ceci avec GDI?Comment créer un bitmap avec un canal alpha à la volée en utilisant GDI?
Répondre
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.
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).
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.
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
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
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
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.
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
J'ai aussi le problème des lignes dentelées et j'utilise GDI + quand je fais un 'CImage :: AlphaBlend' – sergiol
@sergiol il n'y a pas assez d'informations dans cette déclaration pour vous aider. Je suggère d'ouvrir une nouvelle question. –
- 1. Comment dessiner un bitmap ARGB en utilisant GDI +?
- 2. redimensionnement d'une image avec canal alpha
- 3. Comment détecter par programme si un bitmap a un canal alpha?
- 4. Comment créer un MaskedEditExtender à la volée?
- 5. comment créer un document XML à la volée avec xquery?
- 6. Dessiner sur un objet graphique GDI + un bitmap utilisant StretchDIBits pour la mise à l'échelle
- 7. Possible de créer un bitmap géré (non-GDI)?
- 8. Créer un nouvel élément à la volée
- 9. Canal alpha dans OpenCV
- 10. GDI + exception sauvegarde un bitmap à un MemoryStream
- 11. Comment dessiner un bitmap avec 50% d'opacité?
- 12. Représentation hexadécimale d'une couleur avec un canal alpha?
- 13. Effacer le canal alpha d'un NSImage
- 14. Comment obtenir une vignette de dossier avec canal alpha
- 15. Utilisation de GDI + Bitmap
- 16. GDI +: comment rendre un objet Graphics à un bitmap sur un thread d'arrière-plan?
- 17. Composant Alpha Blanket dans GDI +
- 18. Comment créer un sous-domaine à la volée avec ASP.Net pour un serveur Windows 2008
- 19. Comment créer un périphérique GDI personnalisé?
- 20. Comment puis-je dessiner une image avec un canal alpha défini par programme dans .NET?
- 21. Inscriber Technology Via Builder et Delphi - Support du canal Alpha
- 22. Créer une image avec un arrière-plan transparent en utilisant GDI +?
- 23. canal Alpha dans IE 6.x
- 24. Comment convertir une structure de type gdi + bitmap en HDC?
- 25. C#: GDI +: Écraser une image en utilisant la méthode Save de Bitmap
- 26. Comment faire pour convertir l'image de * GDI + en bitmap *
- 27. superposer une image jpeg avec texte riche en utilisant un éditeur mignon et GDI +
- 28. images qui se chevauchent en utilisant GDI +
- 29. Comment peindre un bitmap avec perspective?
- 30. Est-il possible de convertir un contrôle ASP.NET en une image à la volée?
Malheureusement, je n'utilise pas de langage géré. Je vais devoir utiliser des API Windows vanilles. – wkf
C'est faisable, mais pas par moi. =) – MusiGenesis