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 :

Problème de transparence lors du dessin d'images


Sujet :

C#

  1. #1
    Membre à l'essai
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 23
    Points : 10
    Points
    10
    Par défaut Problème de transparence lors du dessin d'images
    Bonjour tout le monde,

    Je tourne depuis une semaine sur un problème plutôt épineux, peut-être connaîtriez-vous une solution ?

    Je travaille actuellement sur une librairie de gestion d'imprimantes. J'utilise la classe PrintDocument. Comme vous le savez sûrement, pour gérer l'impression d'une page, on récupère un Graphics à chaque appel de l’évènement d'impression d'une page.

    Sur cette page, on imprime du texte et des images. Pour gérer la transparence de ces éléments, on joue sur la couleur alpha.

    Pour les images, on modifie l'élément 3,3 de la ColorMatrix. Cette ColorMatrix est ensuite attribuée à un ImageAttributes.

    On passe ensuite cet ImageAttributes au Graphics précédemment nommé lors de l'appel de la fonction drawImage().


    Je ne rencontre aucun problème pour la transparence de texte, mais malheureusement les images se contentent de se ternir, sans que l'on puisse voir ce qu'il y a derrière. Voici une image qui illustre mon propos :



    Le texte en bleu est bien transparent, mais l'image de guépard a juste perdu en opacité, sans nous montrer ni l'image qui est derrière, ni la barre verte, ni le texte.

    J'ai tenté de modifier la couleur du background pour voir si la transparence de l'image ne s'appliquait qu'au background du Graphics, mais non : avec un background tout rouge, la transparence nous donne toujours 2 guépards légèrement terne, mais sans rouge dans le fond.

    Je n'ai plus trop d'idée, quelqu'un a-t-il un début de commencement de piste ?

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    tu l'as mis à combien le 3,3 ?
    en le mettant à 0.5 ca marche chez moi


    mon code de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      Private Sub PictureBox1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
            Dim b As System.Drawing.Image = Image.FromFile("d:\i1.jpg")
            e.Graphics.DrawImage(b, 1, 1)
     
            b = Image.FromFile("d:\i2.jpg")
            Dim c As New System.Drawing.Imaging.ColorMatrix
            c.Matrix33 = 0.5
     
            Dim ia As New System.Drawing.Imaging.ImageAttributes
            ia.SetColorMatrix(c)
     
            Dim destrect As New System.Drawing.Rectangle(10, 10, 500, 500)
            e.Graphics.DrawImage(b, destrect, 1, 1, 500, 500, GraphicsUnit.Pixel, ia)
        End Sub
    et un convertisseur vb.net<>c# ^^ :
    http://www.developerfusion.com/tools.../vb-to-csharp/
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    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 raymonde.

    Probablement, comme dis par Pol63 du à une mauvaise initialisation de la classe ColorMatrix.

    voici un code qui fait le boulot sur un picturebox et sur printdocument:
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
    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;
    using System.Drawing.Imaging;
     
    namespace PrintImageWithTransparency
    {
        public partial class Form1 : Form
        {
            Graphics grImage;
            //2 images en resources
            Image currentImage1;
            Image currentImage2; 
            ImageAttributes imgattr;
            Rectangle rcDestImage;
            Bitmap bmp;
            ColorMatrix cMatrix;
            public Form1()
            {
                InitializeComponent();
     
                currentImage1 = PrintImageWithTransparency.Properties.Resources.giraffe;
                currentImage2 = PrintImageWithTransparency.Properties.Resources.Nenuphars;
                pictureBox1.Image = new Bitmap(400, 400);
                this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                cMatrix = new ColorMatrix();
                cMatrix.Matrix33 = 0.4f; 
                imgattr = new ImageAttributes();
                imgattr.SetColorMatrix(cMatrix, ColorMatrixFlag.Default, ColorAdjustType.Default);
     
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                grImage = Graphics.FromImage(pictureBox1.Image );
     
                //dessine image1
                bmp = new Bitmap(currentImage1);
                rcDestImage = new Rectangle(0, 0,
                       bmp.Width, bmp.Height);
     
                 grImage.DrawImage(bmp, rcDestImage, 0, 0, bmp.Width,
                     bmp.Height, GraphicsUnit.Pixel, imgattr);
     
                //dessine un texte transparent
                bmp = new Bitmap(200, 200);
                Graphics grText = Graphics.FromImage(bmp);
                string s = "HORS DE MA VUE ,MARAUD";
                Font fnt = new Font("Times New Roman", 32.0F);
                StringFormat ftext = new StringFormat();
                ftext.FormatFlags = StringFormatFlags.NoClip;
                grText.DrawString(s, fnt, new SolidBrush(Color.Blue), new PointF(0, 0), ftext);
                rcDestImage = new Rectangle(100, 100,
                         bmp.Width, bmp.Height);
                grImage.DrawImage(bmp, rcDestImage, 0, 0, bmp.Width,
                    bmp.Height, GraphicsUnit.Pixel, imgattr);
     
                //dessine image2
                bmp = new Bitmap(currentImage2);
                rcDestImage = new Rectangle(0, 0,
                     bmp.Width, bmp.Height);
     
                 grImage.DrawImage(bmp, rcDestImage, 0, 0, bmp.Width,
                     bmp.Height, GraphicsUnit.Pixel, imgattr);
     
                pictureBox1.Invalidate();
            }
     
     
     
             private void button2_Click(object sender, EventArgs e)
             {
                 this.printDocument1.Print();
             }
     
             private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
             {
                 grImage = e.Graphics;
     
                 //dessine image1 avec le ColorMatrix. 
                 bmp = new Bitmap(currentImage1);
                 rcDestImage = new Rectangle(0, 0,
                        bmp.Width, bmp.Height);
     
                 grImage.DrawImage(bmp, rcDestImage, 0, 0, bmp.Width,
                      bmp.Height, GraphicsUnit.Pixel, imgattr);
     
                 //dessine un texte transparent avec le ColorMatrix.
                 bmp = new Bitmap(200, 200);
                 Graphics grText = Graphics.FromImage(bmp);
                 string s = "HORS DE MA VUE ,MARAUD";
                 Font fnt = new Font("Times New Roman", 42.0F);
                 StringFormat ftext = new StringFormat();
                 ftext.FormatFlags = StringFormatFlags.NoClip;
                 grText.DrawString(s, fnt, new SolidBrush(Color.Blue), new PointF(0, 0), ftext);
                 rcDestImage = new Rectangle(100, 100,
                        bmp.Width, bmp.Height);
                 grImage.DrawImage(bmp, rcDestImage, 0, 0, bmp.Width,
                     bmp.Height, GraphicsUnit.Pixel, imgattr);
     
                 //dessine image2 avec le ColorMatrix.
                 bmp = new Bitmap(currentImage2);
                 rcDestImage = new Rectangle(0, 0,
                      bmp.Width, bmp.Height);
     
                 grImage.DrawImage(bmp, rcDestImage, 0, 0, bmp.Width,
                      bmp.Height, GraphicsUnit.Pixel, imgattr);
     
     
     
             }
     
     
     
        }
    }
    bon code.........

  4. #4
    Membre à l'essai
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Merci pour vos réponses. J'avais mis le 3,3 à 0.5F dans l'image postée en exemple.

    @Mabrouki : j'ai repris le code que tu as posté du coup, vu que tu t'es embêté à me faire un set de test

    Après test, il s'avère que la transparence fonctionne nickel sur la pictureBox, mais malheureusement pas avec le printDocument (je précise que j'ai utilisé PDFCreator pour tester le résultat, et aussi une imprimante phaser).

    La dernière image recouvre entièrement le texte et la première image. Le problème semble donc venir de la fonction DrawImage() du graphics de l'event d'impression d'une page (du-de-d'-d', ouch ).

    Ce qui est vraiment étrange puisque la transparence fonctionne bien avec la fonction drawString (en passant une couleur de type Color.FromArgb("100;X;X;X"); )

    En tout cas merci, tu as rétrécis le champ des possibles sources du problème Si vous avez d'autres idées à me suggérer, n'hésitez pas

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si avec le même code tu as la transparence sur un picturebox mais pas sur un printdocument c'est étrange
    la solution serait alors peut etre de draw sur un new system.drawing.bitmap, puis de draw ce bitmap sur le printdocument, le rendu de la transparence ayant était fait avant
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre à l'essai
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    si avec le même code tu as la transparence sur un picturebox mais pas sur un printdocument c'est étrange
    la solution serait alors peut etre de draw sur un new system.drawing.bitmap, puis de draw ce bitmap sur le printdocument, le rendu de la transparence ayant était fait avant
    Je vais essayer mais sans grand espoir, c'est ce que je faisais au début

  7. #7
    Membre à l'essai
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Alléluia ça marche Pol63, en fait j'avais pas testé de prédessiner l'image final et de l'ajouter ensuite au Graphics de l'event d'impression.

    Merci beaucoup, je vais me débrouiller avec ça

  8. #8
    Membre à l'essai
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    23
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Pour préciser un peu plus, en fait l'algo d'origine fonctionnait bien. C'est simplement que certains drivers de printers prennent en compte la transparence de l'image, alors que d'autres non.

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

Discussions similaires

  1. Problèmes lors d'insertion d'images !
    Par Marc R dans le forum Word
    Réponses: 6
    Dernier message: 20/03/2009, 15h19
  2. Problème transparence lors de la conversion d'une image
    Par Riki dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 20/11/2007, 12h33
  3. Réponses: 2
    Dernier message: 09/04/2007, 22h54
  4. [image] Problème de transparence
    Par Cedrun dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 19/09/2006, 00h40
  5. Réponses: 8
    Dernier message: 06/07/2004, 18h30

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