2009-07-24 3 views

Antwort

3

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.

0

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).

+0

Leider verwende ich keine verwaltete Sprache. Ich muss Vanilla Windows APIs verwenden. – wkf

+0

Das ist machbar, nur nicht von mir. =) – MusiGenesis

-1

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.

+0

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

+0

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

+0

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

0

Gibt es eine Chance, GDI+ anstelle von GDI zu verwenden? Es unterstützt Antialiasing und Transparenz direkt aus der Box.

+0

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

+0

Ich habe auch das Problem der gezackten Linien und ich benutze GDI +, wenn ich ein 'CImage :: AlphaBlend' – sergiol

+0

@sergiol mache, es gibt nicht genug Informationen in dieser Aussage, um Ihnen zu helfen. Ich würde vorschlagen, eine neue Frage zu öffnen. –

Verwandte Themen