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

Composants VCL Delphi Discussion :

QRImage transparent


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 15
    Points : 13
    Points
    13
    Par défaut QRImage transparent
    Bonjour à tous,

    je me trouve face à un problème qui paraît minuscule mais qui m'ennuie beaucoup !

    Je suis en Delphi 6.

    J'ai un objet QRImage sur un QReport, je charge à chaque before print d'une bande, l'image adéquate au QRImage. Mais voilà, je n'arrive pas à avoir de transparence sur mon image. Et il me faut à tous prix obtenir la transparence, car cette même image peut se trouver sur des fonds de différentes couleurs.

    Pourriez-vous m'aider ?


    J'ai utiliser les propriétés :
    1- Tansparent,
    2- TransparentColor,
    3- TransparentMode
    de l'objet Bitmap, mais rien à faire !


  2. #2
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Je ne connais pas du tout ce composant mais est ce qu'il t'offre la possibilitée de choisir un format d'image autre que bmp, si c'est le cas, tu peux installer l'unité pngImage qui te permettra de pouvoir charger une image au format png (qui gère la transparence).
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Non, les seules images que je peux charger sont les .BMP et les .ICO
    Mais le principe des propriétés marchent bien pour les TImage.

    ça commence à me g.......

  4. #4
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Alors désolé, je peux pas t'aider plus
    ----------------------------------------------------
    Avant de poster, pensez à utiliser les différents outils à votre disposition:
    Google, la FAQ et le moteur de recherche.

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Ouin, ouin !!!

    A l'aide !!!
    Je ne vois pas comment faire autrement !

  6. #6
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut
    Salut,

    Il faut créer un nouveau TQRImage comme ceci :
    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
    uses QuickRpt, QRCtrls;
     
    TMyQRImage = class(TQRImage)
      private
      protected
        procedure Print(OfsX, OfsY: Integer); override;
      public
      published
        property Transparent;
      end;
     
    implementation
     
    uses QRPrntr;
     
    ...
     
    procedure TMyQRImage.Print(OfsX, OfsY : Integer);
    var
      Dest : TRect;
      DC, SavedDC : THandle;
    begin
      if parentreport.Exporting then
      begin
             TQRExportFilter(ParentReport.ExportFilter).acceptgraphic(
                                  qrprinter.XPos(OfsX + self.Size.Left),
                                  qrprinter.YPos(OfsY+ self.size.top ), self );
      end;
      Dest.Top := QRPrinter.YPos(OfsY + Size.Top);
      Dest.Left := QRPrinter.XPos(OfsX + Size.Left);
      Dest.Right := QRPrinter.XPos(OfsX + Size.Width + Size.Left);
      Dest.Bottom := QRPrinter.YPos(OfsY + Size.Height + Size.Top);
      if Stretch then
      begin
        if Picture.Graphic is TBitmap then
        begin
          if Transparent then
          begin
            QRPrinter.Canvas.Brush.Color := Parent.Color;
            QRPrinter.Canvas.BrushCopy(Dest, Picture.Bitmap, Picture.Bitmap.Canvas.ClipRect, Picture.Bitmap.TransparentColor);
          end
          else
            PrintBitmap(QRPrinter.Canvas, Dest, TBitmap(Picture.Graphic));
        end
        else
          with QRPrinter.Canvas do
            StretchDraw(Dest, Picture.Graphic);
      end
      else
      begin
        IntersectClipRect(QRPrinter.Canvas.Handle, Dest.Left, Dest.Top, Dest.Right, Dest.Bottom);
        DC := GetDC(QRPrinter.Canvas.Handle);
        SavedDC := SaveDC(DC);
        Dest.Right := Dest.Left +
          round(Picture.Width / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.XFactor);
        Dest.Bottom := Dest.Top +
          round(Picture.Height / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.YFactor);
        if Center then OffsetRect(Dest,
          (QRPrinter.XSize(Size.Width) -
            round(Picture.Width / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.XFactor)) div 2,
          (QRPrinter.YSize(Size.Height) -
            round(Picture.Height / Screen.PixelsPerInch * 254 * ParentReport.QRPrinter.YFactor)) div 2);
        if Picture.Graphic is TBitmap then
        begin
          if Transparent then
          begin
            QRPrinter.Canvas.Brush.Color := Parent.Color;
            QRPrinter.Canvas.BrushCopy(Dest, Picture.Bitmap, Picture.Bitmap.Canvas.ClipRect, Picture.Bitmap.TransparentColor);
          end
          else
            PrintBitmap(QRPrinter.Canvas, Dest, TBitmap(Picture.Graphic));
        end
        else
          QRPrinter.Canvas.StretchDraw(Dest, Picture.Graphic);
       RestoreDC(DC, SavedDC);
       SelectClipRgn(QRPrinter.Canvas.Handle, 0);
      end;
      if ParentReport.FinalPass and Frame.AnyFrame then
        Frame.PaintIt(ParentReport.QRPrinter.Canvas,
          Rect(ParentReport.QRPrinter.XPos(OfsX + Size.Left),
          ParentReport.QRPrinter.YPos(OfsY + Size.Top),
          ParentReport.QRPrinter.XPos(OfsX + Size.Left + Size.Width),
          ParentReport.QRPrinter.YPos(OfsY + Size.Top + Size.Height)),
          ParentReport.QRPrinter.XFactor,
          ParentReport.QRPrinter.YFactor);
    end;
    A+
    On ne me la fait pas à moi !

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Merci à toi fs999 !!!!

    ça marche !!!

    En fait, je n'ai pas refait d'objet, j'ai juste tapé le code suivant dans le BeforePrint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Image := TImage.Create(QRImage.Parent);
        Image.Picture.Bitmap.LoadFromFile(FileName);
        Image.Picture.Bitmap.TransparentMode := tmAuto;
        QRImage.Canvas.BrushCopy(QRImage.Canvas.ClipRect, Image.Picture.Bitmap, Image.Picture.Bitmap.Canvas.ClipRect, Image.Picture.Bitmap.TransparentColor);
        Image.Free;
    De cette manière, j'utilise le bon fonctionnement du TImage.

    En fait, avec les points d'arrêt, je me suis rendu compte que ce qui n'allait pas était l'affectation de TansparentColor à QRImage.Picture.Bitmap.
    La valeur était 33554432 et reste 33554432 après l'affectation. Je ne sais pas la couleur équivalente à cette valeur.

  8. #8
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Ushu, puis-je requérir ton concours pour ressusciter un sujet vieux de plus de 3 ans ? Parce que chez moi, l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       QRImage.Canvas.BrushCopy(QRImage.Canvas.ClipRect,
                                Image.Picture.Bitmap, Image.Picture.Bitmap.Canvas.ClipRect,
                                Image.Picture.Bitmap.TransparentColor);
    provoque une erreur
    Violation d'accès à l'adresse 005AD5B3 dans le module 'Mon Test.exe' Lecture de l'adresse 0000004.
    Voici mon code complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TStdReport.DetailBandBeforePrint(Sender: TQRCustomBand;
      var PrintBand: Boolean);
    Var
    Image : TImage;
    QrImage : TQrImage;
    begin
       Image := TImage.Create(QRImage.Parent);
       Image.Picture.LoadFromFile(MainForm.CurDir + 'Specimen.Bmp' );
       Image.Picture.Bitmap.TransparentMode := tmAuto;
       QRImage.Canvas.BrushCopy(QRImage.Canvas.ClipRect,
                                Image.Picture.Bitmap, Image.Picture.Bitmap.Canvas.ClipRect,
                                Image.Picture.Bitmap.TransparentColor);
       Image.Free;
    end;

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    QrImage correspond au TQrImage posé sur le TQuickRep pas à une variable supplémentaire.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  10. #10
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut
    Salut à tous,

    Je ne sais pas si c'est toujours d'actualité, mais Defluc, ton code n'est pas correct. C'est pas très joli, car normalement c'est après BeforePrint que le test de changement de page se fait...
    Voici le corrigé qui devrait fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TStdReport.DetailBandBeforePrint(Sender: TQRCustomBand;
      var PrintBand: Boolean);
    Var
      bmp : TBitmap;
    begin
      bmp := TBitmap.Create;
      bmp.LoadFromFile(MainForm.CurDir + 'Specimen.Bmp' );
      bmp.TransparentMode := tmAuto;
      with DetailBand.ParentReport.QRPrinter.Canvas do
        BrushCopy(ClipRect, bmp, bmp.Canvas.ClipRect, bmp.TransparentColor);
       bmp.Free;
    end;
    A+
    On ne me la fait pas à moi !

  11. #11
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Message bien reçu mais je travaille avec des images jpeg pour réduire le volume de données.

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

Discussions similaires

  1. comment faire un background transparent?
    Par guigui1005 dans le forum Composants
    Réponses: 5
    Dernier message: 17/05/2012, 21h45
  2. [Composant] La transparence
    Par Nuts07 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/05/2003, 14h51
  3. Comment rendre transparent le tour d un icone
    Par NeoRonin dans le forum Composants VCL
    Réponses: 7
    Dernier message: 03/03/2003, 01h40
  4. Réponses: 1
    Dernier message: 23/02/2003, 06h22
  5. ouverture d'une form en fondu transparent
    Par nicholz dans le forum Composants VCL
    Réponses: 9
    Dernier message: 08/01/2003, 11h06

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