2011-01-11 9 views
0

Ich würde die Hilfe von Ihnen Low-Level-Programmierer schätzen ... Mein Problem ist das: Ich möchte eine Bitmap des Formats ARGB8888 direkt in den Videospeicher drucken. Die Form der Bitmap ist in Ordnung, das Problem ist der Alpha-Kanal, den ich nicht verstehen kann. Ich habe Code in wikipedia gesehen, dass die Pixel wie diese Overlays:Wie behandelt man Alpha-Transparenz von PNG direkt im Speicher?

CompositedPixelColor = Alpha * ForegroundPixelColor + (1 - Alpha) * BackgroundPixelColor 

Wenn eine Farbe von 0 variiert - 1. Diese für jeden Kanal RG B. erfolgt Was ich tue, ist jedes Byte kopieren für jede Farbe jedes Pixels meiner Bitmap direkt in den Videospeicher mit der obigen Formel, aber ich vermisse etwas, weil die Farben nicht in Ordnung sind.

Ich versuche, so etwas wie der Code in diesem Thread zu tun: http://www.badadev.com/create-a-photo-editing-app/ Aber hier sind sie nicht behandeln, Transparenz, und das ist mein Problem. Danke!

Antwort

0

In dem Code, den Sie gepostet haben, wird alpha als Wert zwischen 0 und 1 behandelt, was natürlich nicht funktioniert, wenn Sie Ihren Alpha-Kanal als vorzeichenloses Zeichen verwenden. Verwenden Sie Folgendes, wenn Sie es im Integer-Raum tun möchten :

unsigned short background = 0x40; 
unsigned short foreground = 0xe0; 
unsigned short alpha = 0xc0; 
unsigned short compositedcolor = (alpha * foreground + (0xff - alpha) * background) >> 8; 

beachten Sie, dass während diese Shorts sind die Werte alle 0 sein sollte - 255 wird das kurze gerade als Rechenraum für die char * char Produkte benötigt werden, können Sie auch Zwischen Abgüsse, aber ich nur ohne Vorzeichen verwendet kurze Typen für alle, um es lesbarer zu machen.

+0

Oh, danke für den Tipp. Ich habe das Problem jedoch herausgefunden. Der RGBA-Wert wird im ABGR-Format gespeichert. Aber Ihr Code erinnert mich an etwas, das die Berechnungen verbessern sollte: >> 8 Thx eine Menge – HugoFS

Verwandte Themen