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

API, COM et SDKs Delphi Discussion :

probleme avec PLGBLT


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut probleme avec PLGBLT
    Bonjour

    Charechant a a faire pivoter des images je suis tomber sur l'api PLGBLT qui semble bien pour cela
    j'ai donc fait une procedure comme celle ci pour tester
    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
    procedure RotateBitmap(Bmp: TBitmap; Rads: Single; AdjustSize: Boolean;
      BkColor: TColor = clWhite );
    var
      C: Single;
      S: Single;
      Tmp: TBitmap;
      OffsetX: Single;
      OffsetY: Single;
      Points: array[0..2] of TPoint;
    begin
      C := Cos(DegToRad(Rads));
      S := Sin(DegToRad (Rads));
      Tmp := TBitmap.Create;
      try
        tmp.PixelFormat := bmp.PixelFormat ;
        Tmp.TransparentColor := Bmp.TransparentColor;
        Tmp.TransparentMode := Bmp.TransparentMode;
        Tmp.Transparent := Bmp.Transparent;
        Tmp.Canvas.Brush.Color := BkColor;
        if AdjustSize then
        begin
          Tmp.Width := Round(Bmp.Width * Abs(C) + Bmp.Height * Abs(S));
          Tmp.Height := Round(Bmp.Width * Abs(S) + Bmp.Height * Abs(C));
          OffsetX := (Tmp.Width - Bmp.Width * C + Bmp.Height * S) / 2;
          OffsetY := (Tmp.Height - Bmp.Width * S - Bmp.Height * C) / 2;
        end
        else
        begin
          Tmp.Width := Bmp.Width;
          Tmp.Height := Bmp.Height;
          OffsetX := (Bmp.Width - Bmp.Width * C + Bmp.Height * S) / 2;
          OffsetY := (Bmp.Height - Bmp.Width * S - Bmp.Height * C) / 2;
        end;
        Points[0].X := Round(OffsetX);
        Points[0].Y := Round(OffsetY);
        Points[1].X := Round(OffsetX + Bmp.Width * C);
        Points[1].Y := Round(OffsetY + Bmp.Width * S);
        Points[2].X := Round(OffsetX - Bmp.Height * S);
        Points[2].Y := Round(OffsetY + Bmp.Height * C);
        PlgBlt(Tmp.Canvas.Handle, Points, Bmp.Canvas.Handle, 0, 0, Bmp.Width,
          Bmp.Height, 0, 0, 0);
        Bmp.Assign(Tmp);
      finally
        Tmp.Free;
      end;
    end;
    cela fonctionne tres bien avec de petite image (2808*1872)
    des que je test avec les image issue de mon APN qui sont en 5616*3744 la çà ne marche que si je défini un angle de 180° dans le cas contraire l'image est vide
    pourquoi cette limitation ?
    quel autre moyen rapide ais je pour pivoter une image ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    2808*1872 une petite image
    5616*3744 c'est assez costaud, 63Mo en mémoire, la Rotation étant plus grande (à 45° ça doit être le pire), ça doit être un trop grand !

    Que renvoie GetLastError juste après PLGBLT ?

    Essaye le TRotateImage, tu as le code complet !

    Code surement plus lent mais peut-être sans limitation du GDI
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Il y a aussi SetWorldTransform.
    Sinon, peut-être temps de passer à GDI+

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Bonjour

    merci bien pour les réponses

    le comportement est différent entre un XP et Seven
    Avec XP cela fonctionne bien alors que que sous Seven non

    J'ai pris juste la fonction de rotation dans le Trotateimage cela marche bien
    c'est même plus rapide que BlGblt quand il marche

    gelasterror renvoie toujours 6 (descripteur non valide)

    je vais regarder ce que donne setworldTransform et GDI+

    pour info dev sous Delphi XE3
    os : au taf XP 32bits
    a la maison Seven 64Bits

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Bonjour

    je viens de tester GDIPLUS de Erik van Bilsen
    cela marche bien

    vous avez déjà testé ?

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    C'est ce que j'utilise

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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