IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Fond noir sur images transparentes


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Fond noir sur images transparentes
    Bonjour,

    Je souhaite afficher une image bitmap sur une form, et je rencontre un problème avec les transparences.

    J'ai cherché un peu sur le net, et j'ai cru comprendre que c'est un bug de GDI+ qui colle un fond noir à la place de la transparence, et qu'il faut donc "composer" l'image dans un bitmap intermédiaire avant de l'afficher pour éviter cela. Soit.
    (Je vous laisse le soin de confirmer ou non )

    Quoi qu'il en soit, j'ai le même souci quand j'opère sur un bitmap de travail.

    Dans le cas présent et pour l'exemple, je travaille sur un PNG-24, avec une couleur mauve comme chroma key à rendre transparente. Pour résumer j'effectue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    mainBitmap = (Bitmap)System.Drawing.Bitmap.FromFile(FileName); //charge l'image
    mainBitmap.MakeTransparent(Color.FromArgb(255,0,255)); //rend le mauve transparent
     
    buffer = new Bitmap(Width, Height); //crée un bitmap de travail
    bufferGfx = Graphics.FromImage(buffer);
     
    bufferGfx.Clear(Color.FromArgb(255,255,0)); //remplis le bitmap d'un fond jaune
    bufferGfx.DrawImage(mainBitmap, 0,0); //copie mon image sur la bitmap de travail
    Par cette méthode j'obtiens du noir qui couvre mon fond jaune à la place d'une transparence. Que ce soit en affichant le bitmap de travail sur ma form ou en le sauvegardant dans un fichier.

    Donc si quelqu'un à un tuyau sur le sujet je suis preneur, d'autant plus que si j'ajoute un buffer.MakeTransparent(Color.FromArgb(0,0,0)) à la fin, le noir passe bien transparent (mais du coup efface également le fond jaune, donc ça ne va pas ), c'est à n'y rien comprendre.

    Je vous fait un dessin si vous voulez

  2. #2
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Par défaut to bitmap n'a pas de couleur (color.Empty)
    Cette absence de couleur se traduit par du noir et non du blanc (qui est une saturation de toutes les couleurs)

    Du devrait donc faire un fill de ton bitmap a la couleur de fond choisie
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Bah c'est ce que je fait, je met un fond jaune

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bufferGfx.Clear(Color.FromArgb(255,255,0)); //remplis le bitmap d'un fond jaune
    Mais quand je superpose mon bitmap transparent, les pixels transparents deviennent noirs

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Il se pourrait qu'il y ai un vieux reste des anciens système.
    Pour le savoir, assures-toi que le pixel du coin supérieur gauche de l'image (coordonné (1,1) pour la class Bitmap) soit de la couleur transparente (donc dans ton cas mauve).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Le 1er pixel sur mon image de test est bien mauve.

    J'avoue que cette histoire me laisse perplexe, c'est quand même une fonction assez basique, ça devrais fonctionner comme on l'entend

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    C'est en effet très étrange.

    Autres chose que je viens de voir la méthode "FromFile" que utilise proviens de la classe mère "Image"
    Elle ne fait pas exactement la meme chose que le constructeur de "Bitmap"
    du coup devrait essayer ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mainBitmap = (Bitmap)new System.Drawing.Bitmap(FileName); //charge l'image

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Pas de changement notoire en employant cette fonction.

    A noter que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mainBitmap = (Bitmap)System.Drawing.Bitmap.FromFile(FileName); //charge l'image
    mainBitmap.Save("truc.png", ImageFormat.Png);
    mainBitmap.MakeTransparent(Color.FromArgb(255,0,255)); //rend le mauve transparent
    mainBitmap.Save("muche.png", ImageFormat.Png);
    J'obtiens bien l'image d'origine dans le 1er fichier (mauve conservé) et l'image correcte dans le second (mauve remplacé par une transparence).
    Je suppose donc que l'image est chargée correctement et que le problème interviens ensuite.

  8. #8
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour ZeroDivide.
    zerodivide give an infinity....
    Tu es confronte au CompositingMode de la classe graphics....Au lieu de mettre ta couleur mauve completement transparente mets la partiellement transparente (canal alpha egal par exemple 160)....
    Dans ce cas la il y a 2 choix à faire avant de dessiner ton mainBitmap:
    -CompositingMode.SourceCopy.
    -CompositingMode.SourceOver.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    //add using
    using System.Drawing.Drawing2D;
     
    namespace BitmapCompositingMode
    {
        public partial class Form1 : Form
        {
            Bitmap mainBitmap;
            Bitmap  buffer;
            Graphics bufferGfx;
            string FileName;
            public Form1()
            {
                InitializeComponent();
            }
            //dessin avec  CompositingMode.SourceCopy
            private void btnDrawBmpSrcCopy_Click(object sender, EventArgs e)
            {
     
                mainBitmap = (Bitmap)System.Drawing.Bitmap.FromFile(FileName); //charge l'image
                mainBitmap.MakeTransparent(Color.FromArgb(255, 0, 255)); //rend le mauve transparent
     
                buffer = new Bitmap(Width, Height); //crée un bitmap de travail
                bufferGfx = Graphics.FromImage(buffer);
     
                //cette ligne fait que le 2eme dessin aura son canal alpha sera inoperant.... 
                bufferGfx.CompositingMode = CompositingMode.SourceCopy;
     
                // 1er dessin: ceci equivaut à dessiner un bitmap jaune.
                bufferGfx.Clear(Color.FromArgb(255, 255, 0)); //remplis le bitmap d'un fond jaune
                // 2er dessin: 
                bufferGfx.DrawImage(mainBitmap, 0, 0); //copie mon image sur la bitmap de travail
            }
     
            //dessin avec  CompositingMode.SourceOver
            private void btnDrawBmpSrcOver_Click(object sender, EventArgs e)
            {
                mainBitmap = (Bitmap)System.Drawing.Bitmap.FromFile(FileName); //charge l'image
                mainBitmap.MakeTransparent(Color.FromArgb(255, 0, 255)); //rend le mauve transparent
     
                buffer = new Bitmap(Width, Height); //crée un bitmap de travail
                bufferGfx = Graphics.FromImage(buffer);
     
                //cette ligne fait que le 2eme dessin aura cettre fois son canal alpha =>operant.... 
                bufferGfx.CompositingMode = CompositingMode.SourceOver  ;
     
                // 1er dessin: ceci equivaut à dessiner un bitmap jaune.
                bufferGfx.Clear(Color.FromArgb(255, 255, 0)); //remplis le bitmap d'un fond jaune
     
                // 2er dessin: 
                bufferGfx.DrawImage(mainBitmap, 0, 0); //copie mon image sur la bitmap de travail
            }
     
     
        }
    }
    extrait MSDN doc à relire attentivement avec 2 bout de code illustratif:
    Comment : utiliser le mode de composition pour commander la fusion alpha...
    Le code dessine la bitmap à l'écran deux fois : une fois sur un arrière-plan blanc, une autre sur un arrière-plan multicolore. Les pixels dans la bitmap qui font partie des deux ellipses ont un composant alpha de 160 et se fondent donc aux couleurs d'arrière-plan sur l'écran.

    L'illustration suivante montre la sortie de l'exemple de code. Notez que les ellipses se fondent à l'arrière-plan, mais ne se fondent pas entre elles.
    code msdn exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    // Create a blank bitmap.
    Bitmap myBitmap = new Bitmap(180, 100);
     
    // Create a Graphics object that we can use to draw on the bitmap.
    Graphics bitmapGraphics = Graphics.FromImage(myBitmap);
     
    // Create a red brush and a green brush, each with an alpha value of 160.
    SolidBrush redBrush = new SolidBrush(Color.FromArgb(160, 255, 0, 0));
    SolidBrush greenBrush = new SolidBrush(Color.FromArgb(160, 0, 255, 0));
     
    // Set the compositing mode so that when we draw overlapping ellipses,
    // the colors of the ellipses are not blended.
    bitmapGraphics.CompositingMode = CompositingMode.SourceCopy;
     
    // Fill an ellipse using a red brush that has an alpha value of 160.
    bitmapGraphics.FillEllipse(redBrush, 0, 0, 150, 70);
     
    // Fill a second ellipse using a green brush that has an alpha value of 160. 
    // The green ellipse overlaps the red ellipse, but the green is not 
    // blended with the red.
    bitmapGraphics.FillEllipse(greenBrush, 30, 30, 150, 70);
     
    // Set the compositing quality of the form's Graphics object. 
    e.Graphics.CompositingQuality = CompositingQuality.GammaCorrected;
     
    // Draw a multicolored background.
    SolidBrush colorBrush = new SolidBrush(Color.Aqua);
    e.Graphics.FillRectangle(colorBrush, 200, 0, 60, 100);
    colorBrush.Color = Color.Yellow;
    e.Graphics.FillRectangle(colorBrush, 260, 0, 60, 100);
    colorBrush.Color = Color.Fuchsia;
    e.Graphics.FillRectangle(colorBrush, 320, 0, 60, 100);
     
    // Display the bitmap on a white background.
    e.Graphics.DrawImage(myBitmap, 0, 0);
     
    // Display the bitmap on a multicolored background.
    e.Graphics.DrawImage(myBitmap, 200, 0);
    suit cette cette citation:
    Si vous souhaitez que les ellipses se fondent entre elles comme à l'arrière-plan, changez cette instruction de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bitmapGraphics.CompositingMode = CompositingMode.SourceOver;
    Ceci fait que le CompositingMode permet:
    -de rendre 1 couleur A (qui est transparente) transparente ou pas vis à vis d'autre couleur B(qui peut etre aussi transparente) ...ca se complique hein...
    Note egalement que l'ordre de dessin intervient evidement.......
    Bon code.....

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Merci pour les infos mais j'ai en fait résolu le problème, qui venait d'ailleurs.

    En fait j'effectue un travail sur l'image pour modifier les couleurs, et j'utilise un bitmap.LockBits pour faire ça rapidement avec un pointeur en unsafe.

    J'avais dedans en paramètre le PixelFormat Format32bppRgb, au lieu de Format32bppArgb.
    Evidemment avec un format sans alpha, ça marche moins bien les transparences

    Je suis déja dehors


    Merci tout de même pour le coup de main

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pixel noir sur image
    Par lauretflo dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 20/01/2015, 15h11
  2. Rollover avec superposition fond noir transparent et texte sur une image
    Par altair8080 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 06/08/2013, 00h32
  3. [Flex4] Fond noir sur le header d'une AdvancedDataGridColumn
    Par vilveq dans le forum Flex
    Réponses: 0
    Dernier message: 02/09/2011, 17h01
  4. toolbar fond transparent sur image
    Par sp2308 dans le forum Débuter
    Réponses: 1
    Dernier message: 19/12/2009, 17h01
  5. Couleur de fond noire avec Image.Save
    Par olibara dans le forum C#
    Réponses: 8
    Dernier message: 11/08/2008, 14h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo