ColorPalette



  • Hallo zusammen, ich möchte in einer CImage eine Farbe transparent machen. Da gibt es die Member: SetTransparentColor, sie nimmt einen Index in eine ColorPalette entgegen. Was ist denn eine Color-Palette ? Kann man diese selbst erstellen, oder existiert sie bereits ? Gegoogelt habe ich schon, ohne Erfolg. An der Stelle interessiert mich noch, wie man mit VS 2008 Standard, MFC ein Bitmap mit einer transparenten Farbe erstellt, im Bitmap Designer . Und, kann man auch mit OpenOffice Draw ein Bild mit transparenter Farbe erstellen, und das in MFC anzeigen lassen ? Weiss jemand Rat ?



  • Mit CImage::GetColorTable kommst du an die Farbpalette.
    Du kannst aber auch beim Erzeugen angeben, daß es sich um ein ARGB-Bild handelt: CImage::Create (createAlphaChannel), dann kannst du den Alpha-Wert einzelner Pixel auf 0 setzen (und du hast volle Transparenz).

    Welche BPP (Bits per Pixel) haben denn deine CImage-Objekte?


  • Mod

    Mal nach "transparent BitBlt" gesucht?
    Vermutlich nicht...

    Nur einer der Ansätze:
    http://www.winprog.org/tutorial/transparency.html

    Gleicher Ansatz (uralt)
    https://www.codeguru.com/cpp/g-m/bitmap/article.php/c1753/Transparent-Bitmap--True-Mask-Method.htm

    https://www.codeproject.com/Articles/703/Drawing-Transparent-Bitmap-with-ease-with-on-the-f

    Von Alpha Channels will ich erst gar nicht anfangen zu schreiben...



  • Ich habe noch kein konkretes CImage, ich möchte es von OpenOffice Draw importieren. Deshalb weiss ich noch nicht wieviel Bits/Pixel vorliegen.
    Die Idee, das CImage zu durchlaufen, und die Alpha Werte einer bestimmten Farben auf 0 zu setzten ist gut, es müsste irgendwie kürzer gehen. Ich mache immer eine Bottom-Up Vorgehensweise, ich lege mir Dinge zurecht, die ich später gebrauchen kann. Über GetColorTable, habe ich bei der MSDN-Dokumentation nichts gefunden.

    BOOL TransparentBlt(
    HDC hDestDC,
    int xDest,
    int yDest,
    int nDestWidth,
    int nDestHeight,
    UINT crTransparent = CLR_INVALID // geht hier auch RGB(0, 255, 0, 0) ?
    ) const throw( );

    Ich suche eine Member, die nur eine Farbe transparent macht, ohne dass das CImage angezeigt wird.



  • Sorry, Martin da habe ich was falsch verstanden, es müsste aber doch mit SetTransparentColor gehen.


  • Mod

    Ja!



  • Ja ich weiss, ich bin manchmal daneben, die Funktionsweise von Get/SetColorTable habe ich nicht verstanden, trotz Recherche, ja ich weiss Martin man darf die MFC nicht kritisieren.



  • Bei C# .NET heisst es: bitmap.MakeTransparent(Color.FromArgb(255, 255, 255, 0));
    Und nicht mit Masken zeilenweise Code Schreiben ! Mein altes MFC-Programm pflege ich weiterhin, dann ist aber Schluss !


  • Mod

    Imager schrieb:

    Ja ich weiss, ich bin manchmal daneben, die Funktionsweise von Get/SetColorTable habe ich nicht verstanden, trotz Recherche, ja ich weiss Martin man darf die MFC nicht kritisieren.

    😕 Wer sagt das? Ich nicht... ich reagiere seit 10 Jahren nicht mehr auf solche Kritik!

    Zudem hat das mit der MFC Null zu tun.

    Das ist GDI und WinAPI pur...
    Code wie man es macht gibt es zur genüge. C# und .NET macht es auch nur so... das ist das aber eben in der .NET Runtime drin. Mit der MFC/Win32 APII musst Du halt Deinen eigenen Code finden.



  • Also ich finde, es ist immer gut wenn man Funktionalitäten kapselt, und wenn das in der Programmiersprache schon da ist, ist das von grossem Vorteil ! Aber seit mir nicht böse, wenn es geht, gebt mir doch eine Antwort auf meine Frage. Wir posten schon 8 mal ! Gewisse Sympathien gegenüber MFC habe ich, ja ! Ich möchte gern zweigleisig fahren ! Was ich nicht verstehe, ist das man ein ganzes Array von Farben braucht ( in diesem RGBQUAD Array ) wenn man doch nur eine transparente Farbe haben will.



  • Probiere mal Drawing transparent bitmaps using CImage

    PS: Bitmap.MakeTransparent in .Net benutzt intern die GDI+-Funktion GdipDrawImageRectRectI (s. Übersicht Graphics Functions (GDI+)) mit vorher gesetzten GdipSetImageAttributesColorKeys.


  • Mod

    Imager schrieb:

    Wir posten schon 8 mal !

    Was spricht gegen die existierenden Codevorschläge?
    Der Code-Link, den th69 gesendet hat, basiert letzten Endes auch wieder auf einem Link, den Du schon hast!

    Oder habe ich was verpasst?



  • Ihr müsst entschuldigen, ich muss starke Medikamente einnehmen, und kann deswegen manchmal inkorrekt, und unlogisch schreiben. Die Links basieren auf Masken und beinhalten jeweils über 30 Zeilen Code. Ich habe die Funktionsweise auch nicht richtig verstanden. Ich habe mich auf SetTransparentColor festgelegt. Woher bekomme ich die Farbpalette, und woher weiss ich was da für Farben drinstehen. SetTransparentColor benötigt einen Index auf eine Farbpalette, wie komme ich an den Index ? Was haben Get/SetColorTable für eine Funktion. Das sind meine einzigen Fragen !



  • Die Farbtabelle funktioniert aber nicht für alle möglichen Bilder, deswegen habe ich dich nach den BPP gefragt.



  • Für 32 Bit, Wie ? Bitte, Bitte ...



  • Hat sich erledigt ! Den ganzen Aufwand, hätte man sich mit ein Paar Sätzen sparen können ! Trotzdem Danke für Eure Mühe ! Tschüsss ...


Log in to reply