Ich verwende mehrschichtige Fenster und zeichne ein abgerundetes Rechteck auf dem Bildschirm. Allerdings möchte ich die gezackten Kanten glätten. Ich denke, dass ich Alpha-Blending dafür brauchen werde. Gibt es eine Möglichkeit, dies mit GDI zu tun?Wie erstelle ich eine Bitmap mit einem Alpha-Kanal im laufenden Betrieb mit GDI?
Antwort
CreateDIBSection. Füllen Sie den BITMAPINFOHEADER mit 32bpp aus. Füllen Sie den Alpha-Kanal mit vor-multipliziertem Alpha und Sie sind gut zu gehen.
AlphaBlend ist die API, um 32 bpp-Bitmaps mit einem aplha-Kanal zu verknüpfen.
Sie können dies in C# mit der LockBits-Methode der BitMap-Klasse (siehe this question für eine Erklärung). Sie möchten definitiv nicht GetPixel und SetPixel dafür verwenden, da sie schrecklich langsam sind (obwohl Sie nur die Kanten und nicht die gesamte Bitmap manipulieren würden).
Es gibt keine einfache Möglichkeit, eine solche Zeichnung nur mit GDI-Aufrufen auszuführen. Was Sie wollen, ist nicht nur Alpha-Blending: Sie wollen Anti-Aliasing. Das bedeutet normalerweise, dass Sie das, was Sie wollen, mit einer größeren Auflösung zeichnen und dann verkleinern.
Was ich in der Vergangenheit für ähnliche Probleme getan habe, ist ein Kunstprogramm zu verwenden, um die gewünschte Form (z. B. eine abgerundete Ecke) viel größer zu zeichnen, als ich es in Schwarz und Weiß brauchte. Wenn ich es zeichnen wollte, würde ich die Schwarz-Weiß-Bitmap auf die von mir gewünschte Größe skalieren (mit einer Variante von scaling class from Code Project). Dies gibt mir ein Graustufenbild, das ich als Alphakanal verwenden kann, das ich dann für Alpha-Blending verwenden würde, entweder durch Aufrufen der Win32-Funktion AlphaBlend oder durch Verwenden einer DIBSection und manuelles Ändern der entsprechenden Pixel. Eine andere Variante dieses Ansatzes wäre es, eine DIBSection etwa viermal größer zuzuordnen, als Sie das Endergebnis haben wollten, zu zeichnen und dann die obige Skalierungsklasse zu verwenden, um sie zu verkleinern: die Skalierung von einem größeren Bild wird ergeben der passende Glättungseffekt.
Wenn das alles ziemlich viel Arbeit klingt: gut, es ist.
EDIT: Um den Titel dieser Frage zu beantworten: Sie können eine Bitmap mit einem Alpha-Kanal erstellen, indem Sie CreateDIBSection aufrufen. Das wird nicht alleine tun, was du willst, denke ich.
Ich bin heute nachmittag über CreateDIBSection gestolpert, als ich MSDN gescannt habe, und es scheint ein Stück zu sein, das mir fehlte. Ich benutze die Linien-/Kreisalgorithmen von Wu zum Zeichnen von Linien und Kreisen mit Anti-Aliasing; Solange ich Zugriff auf die eigentlichen Pixeldaten habe, kann ich sie auf das einstellen, was ich will. Und du hast recht; es wird eine Menge Arbeit! ; p – wkf
Es klingt wie du bist im Grunde dort. DIB-Abschnitte eignen sich hervorragend für grafische Arbeiten: Sie erhalten ein HBITMAP-Handle, aber Sie können auch auf die Rohpixeldaten zugreifen. – DavidK
Anti-Aliasing wird nicht "verkleinert", es fügt zusätzliche Schattierungspixel um diagonale oder gekrümmte Kanten hinzu, um eine glattere Erscheinung zu erhalten. Dies funktioniert VIEL besser, wenn Ihre hinzugefügten Pixel eine Alpha-Komponente haben (d. H. Sie verwenden Alpha-Blending). – Eric
Gibt es eine Chance, GDI+ anstelle von GDI zu verwenden? Es unterstützt Antialiasing und Transparenz direkt aus der Box.
Wenn ich GDI + verwenden würde, würde ich bei den flachen APIs bleiben, die weniger benutzerfreundlich zu sein scheinen. Obwohl, wenn GDI + mir die Arbeit erleichtern würde, wäre ich versucht, zu etwas Klassenfreundlicherem zu wechseln. Ich werde das überprüfen; Vielen Dank! – wkf
Ich habe auch das Problem der gezackten Linien und ich benutze GDI +, wenn ich ein 'CImage :: AlphaBlend' – sergiol
@sergiol mache, es gibt nicht genug Informationen in dieser Aussage, um Ihnen zu helfen. Ich würde vorschlagen, eine neue Frage zu öffnen. –
- 1. Wie ändere ich JPanel in einem JFrame im laufenden Betrieb?
- 2. PHP berechnet eine Variable im laufenden Betrieb mit anonymen Funktionen
- 3. Crop Bild im laufenden Betrieb
- 4. Sound Generation im laufenden Betrieb
- 5. Schreibe eine Ruby-Klasse im laufenden Betrieb
- 6. Kann ich SparkContext.appName im laufenden Betrieb ändern?
- 7. UIMenuController im laufenden Betrieb aktualisieren
- 8. Wie Klasse mit virtuellen Methode im laufenden Betrieb implementieren
- 9. Wie erstelle ich eine Bitmap aus einer Matrix mit Matlab
- 10. Parsing RST zu HTML im laufenden Betrieb mit Docutils
- 11. Erstellen von PayPal-Tasten im laufenden Betrieb
- 12. visio-Diagramm im laufenden Betrieb mit .NET generieren
- 13. ein Bild mit Alphakanal Ändern der Größe
- 14. PHP ZIP-Dateien im laufenden Betrieb
- 15. Sichtbarkeit der Methode im laufenden Betrieb bestimmen
- 16. Wie erstelle ich eine Bitmap mit dem Header BITMAPV5HEADER?
- 17. Spark Cassandra Anwendung immer im laufenden Betrieb
- 18. Wie erstelle ich eine Bitmap mit einem transparenten Hintergrund in einem transparenten Formular?
- 19. Erstellen einer transparenten Bitmap mit GDI?
- 20. Video-Stream-Analyse im laufenden Betrieb - beraten?
- 21. Android, App-Klassen im laufenden Betrieb aktualisieren
- 22. Wie kann ich eine neue SQLite-Datenbank mit allen Tabellen im laufenden Betrieb erstellen?
- 23. WPF Bitmap Bindung mit GDI + Ausnahme
- 24. Komprimierung von 2-D-Array im laufenden Betrieb mit iOS
- 25. Ändern der aktiven Soundkarte im laufenden Betrieb
- 26. Anfrage Erlaubnis im laufenden Betrieb erlaubt nicht
- 27. Wie programmgesteuert erkennen, ob eine Bitmap Alphakanal hat?
- 28. Python-Debugging: Code-Bearbeitung im laufenden Betrieb
- 29. Erstellen eines dom-Objekts im laufenden Betrieb mit Aurelia
- 30. asp.net - Generate Powerpoint-Datei im laufenden Betrieb
Leider verwende ich keine verwaltete Sprache. Ich muss Vanilla Windows APIs verwenden. – wkf
Das ist machbar, nur nicht von mir. =) – MusiGenesis