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

Langage Delphi Discussion :

Traduire un bout de code de c++ vers delphi


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 111
    Points : 49
    Points
    49
    Par défaut Traduire un bout de code de c++ vers delphi
    J'essaye de traduire cette fonction vers delphi.Quelqu'un peut m'aider?
    Code c++ : 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
     
    void ClassImg::RGBtoYUV(LPBYTE pdest, LPBYTE psrc, DWORD w, LPBYTE m_AChannel)
    {
        LPBYTE dst = pdest;
    	LPBYTE src = psrc;
    	LPBYTE Ach = m_AChannel;
        DWORD w2 = w >> 1;
        while (w2--)
        {
            int B = *src++;
            int G = *src++;
            int R = *src++;
    		if (Ach) *Ach++ = *src++;
     
            int Y = ((long)(219l* 77*R + 219l*150*G + 219l* 29*B)>>16)+16;
            int U = ((long)(219l*131*B - 219l* 87*G - 219l* 44*R)>>16)+128;
     
        #define clip(x) (((x) & 0xffffff00) ? ((x) & 0x80000000) ? 0 : 255 : (x))
     
            *dst++ = clip(U);
            *dst++ = clip(Y);
     
            B = *src++;
            G = *src++;
            R = *src++;
    		if (Ach) *Ach++ = *src++;
     
            Y = ((long)(219l* 77*R + 219l*150*G + 219l* 29*B)>>16)+16;
            int V = ((long)(219l*131*R - 219l*110*G - 219l* 21*B)>>16)+128;
     
            *dst++ = clip(V);
            *dst++ = clip(Y);
        }
    }

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour.

    Je ne suis pas un expert du C++ mais déjà l'opérateur >> du C++ tu peux le remplacer par l'opérateur shr. LPBYTE doit probablement être un pointeur sur un Byte (PByte).

    Pour le #DEFINE à priori ça déclare une fonction à la volée donc tu dois pouvoir faire pareil avec une fonction interne à la méthode.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 111
    Points : 49
    Points
    49
    Par défaut
    et le 219l? (219l c'est pas 2191)

  4. #4
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    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 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Ce ne serait pas pour dire qu'il faut le prendre en tant qu'entier long?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  5. #5
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 111
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Ce ne serait pas pour dire qu'il faut le prendre en tant qu'entier long?
    peut etre que tu as raison.bon j'essaye la traduction:
    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
     
    Procedure RGBtoYUV(pdest,psrc:pbyte;w:longword;m_AChannel:pointer);
    var
      dst,src,ach:pbyte;
      w2:longword;
      r,g,b,y,u,v:byte;
    begin
      dst := pdest;
    	src := psrc;
    	Ach := m_AChannel;
      w2 := w shr 1;
      while (w2>0) do
      begin
            w2:=w2-1;
             inc(integer(src));
             B := src^;
             inc(integer(src));
             G := src^;
             inc(integer(src));
             R := src^;
         		if (Ach<>nil) then
              begin
                inc(integer(src));
                Ach:=src;
                inc(integer(Ach));
              end;
     
            Y := round(((219* 77*R + 219*150*G + 219* 29*B)shr 16)+16);
            U := round(((219*131*B - 219* 87*G - 219* 44*R)shr 16)+128);
     
    //#define clip(x) (((x) & 0xffffff00) ? ((x) & 0x80000000) ? 0 : 255 : (x))
     
    //        *dst++ = LIMIT(U);
    //        *dst++ = LIMIT(Y);
     
             inc(integer(src));
             B := src^;
             inc(integer(src));
             G := src^;
             inc(integer(src));
             R := src^;
          	if (Ach<>nil) then
              begin
                inc(integer(src));
                Ach:=src;
                inc(integer(Ach));
              end;
     
            Y := round(((219* 77*R + 219*150*G + 219* 29*B)shr 16)+16);
            V := round(((219*131*R - 219*110*G - 219* 21*B)shr 16)+128);
     
    //        *dst++ = LIMIT(V);
    //        *dst++ = LIMIT(Y);
        end;
    end;
    il me reste les commentaires

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    #define clip

    doit etre traduite par une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     clip(x) (((x) & 0xffffff00) ? ((x) & 0x80000000) ? 0 : 255 : (x))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Clib (x : integer) : byte
    begin
     if ((x) and $ffffff00) Then
     begin
       if ((x) and $80000000) Then
         result := 0
       else
         result := 255;
     end
     else
       result := x; 
    end;
    la traduction des conditions n'est pas parfaite mais l'esprit de la traduction est là

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 330
    Points
    11 330
    Billets dans le blog
    6
    Par défaut
    pour la fonction clip, j'aurais tendance à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function Clip (x : integer) : byte
    begin
     if x>255
     then Result:=255
     else begin
      if x<0 
      then Result:=0
      else Result:=x;
     end;
    end;
    sinon, en delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((x) and $ffffff00) > 0
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 330
    Points
    11 330
    Billets dans le blog
    6
    Par défaut
    et au passage, quand on multiplie par 219 tous les membres d'une parenthèse, autant ne le faire qu'une fois en le mettant en facteur !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Y := round(((219* 77*R + 219*150*G + 219* 29*B)shr 16)+16);
    Y := round( ((219*(77*R + 150*G + 29*B)) shr 16)+16);
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

Discussions similaires

  1. Traduire ce bout de code
    Par hdgetnet dans le forum Débuter
    Réponses: 2
    Dernier message: 25/05/2010, 17h08
  2. Traduire ce bout de code Delphi
    Par SmileSoft dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/10/2009, 16h43
  3. Traduction d'un code en C++ vers Delphi
    Par saidus dans le forum Langage
    Réponses: 3
    Dernier message: 06/11/2007, 16h55
  4. [SQL-Server] traduire un bout de code pour oracle en bout de code pour SQL SERVER
    Par teen6517 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/06/2007, 09h47
  5. Réponses: 23
    Dernier message: 26/04/2006, 19h58

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