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 :

Probleme avec ScanLine


Sujet :

Langage Delphi

  1. #1
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut Probleme avec ScanLine
    Salut

    Je suis toujours sur le logiciel de dessin, et je suis en train de modifier le programme pour passer de la propriété Pixels[X,Y] a ScanLine.

    J'essaye d'augmenter la luminosité d'une image, voici les procedures !

    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
    type
      PRGBTripleArray = ^TRGBTripleArray;
      TRGBTripleArray = array [Byte] of TRGBTriple;
     
     
    function AjusterLumImage(I :TBitmap; Correction: Integer):TBitmap;
    var X, Y :integer;
        Ligne : pRGBTripleArray;   //Scanline
        IModif :TBitmap;
    begin
      IModif:=TBitmap.Create;
      IModif.Assign(I);
      IModif.PixelFormat := pf24bit;
     
      for Y:=0 to I.Height-1 do
      begin
        Ligne:=IModif.ScanLine[Y];
        for X:=0 to I.Width-1 do
          Ligne[X]:=AjusterLumPixel(Ligne[X],Correction);
      end;
      AjusterLumImage:=IModif;
      IModif.Free;
    end;
    ... avec ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function AjusterLumPixel(RVB :TrgbTriple; Correction :integer):TrgbTriple;
    var  T,S,L :Byte;
      Resultat :TrgbTriple;
        Correc :real;
    begin
      RVBToTSL(RVB.rgbtRed, RVB.rgbtGreen, RVB.rgbtBlue, T, S, L);
      Correc:=0;
      if Correction>1 then Correc:=Correction/3;
      if Correction<-1 then Correc:=1/(-Correction/3);
      if L>0 then L:=Trunc(Int(Power((L/240),Correc)*240))
             else L:=0;
      TSLToRVB(T, S, L, Resultat.rgbtRed, Resultat.rgbtGreen, Resultat.rgbtBlue);
      AjusterLumPixel:=Resultat;
    end;

    Et les deux procedures de conversion :

    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
    procedure RVBToTSL (const Rouge, Vert, Bleu :Byte; var Teinte, Sat, Lum :Byte);
    var Max, Min, Delta :Byte;
                     T0 :Real;
    begin
     
      Max:=Rouge ;
      if Max<Vert then Max:=Vert;
      if Max<Bleu then Max:=Bleu;
     
      Min:=Rouge ;
      if Min>Vert then Min:=Vert;
      if Min>Bleu then Min:=Bleu;
     
      Delta:=Max-Min;
     
      T0:=0;
      if Delta<>0 then
      begin
        if Max=Rouge  then T0:=(Vert-Bleu)/Delta;
        if Max=Vert then T0:=(Bleu-Rouge )/Delta+2;
        if Max=Bleu then T0:=(Rouge-Vert)/Delta+4;
      end;
     
      Teinte:=(Trunc(Int(T0*60)) mod 300)*2 div 3;
     
      if (((Max+Min)<>0) and ((Max+Min)<255)) or ((Max+Min)=510) then Sat:=(Delta*240) div (Max+Min)
      else Sat:=(Delta*240) div (510-Max-Min);
     
      Lum:=((Max+Min)*240) div 510;
    end;
     
     
     
     
    procedure TSLToRVB (const Teinte, Sat, Lum : Byte; var Rouge, Vert, Bleu :Byte);
    var   Max, Min, Delta, T0 :Real;
    begin
      T0:=(6*Teinte)/240;
     
      if Lum<120 then
      begin
        Max:=255*Lum*(240+Sat) div (240*240);
        Min:=255*Lum*(240-Sat) div (240*240);
      end
      else
      begin
        Max:=255*(Lum*(240-Sat)+Sat*240) div(240*240);
        Min:=255*(Lum*(240+Sat)-Sat*240) div(240*240);
      end;
     
      Delta:=Max-Min;
     
      Rouge:=0;                                     
      Vert:=0;
      Bleu:=0;
     
      case Trunc(T0) of
        0 : begin
              Rouge:=Trunc(Int(Max));
              Vert:=Trunc(Int(Min+(T0*Delta)));
              Bleu:=Trunc(Int(Min));
            end;
        1 : begin
              Rouge:=Trunc(Int(Min+(2-T0)*Delta));
              Vert:=Trunc(Int(Max));
              Bleu:=Trunc(Int(Min));
            end;
        2 : begin
              Rouge:=Trunc(Int(Min));
              Vert:=Trunc(Int(Max));
              Bleu:=Trunc(Int(Min+(T0-2)*Delta));
            end;
        3 : begin
              Rouge:=Trunc(Int(Min));
              Vert:=Trunc(Int(Min+(4-T0)*Delta));
              Bleu:=Trunc(Int(Max));
            end;
        4 : begin
              Rouge:=Trunc(Int(Min+(T0-4)*Delta));
              Vert:=Trunc(Int(Min));
              Bleu:=Trunc(Int(Max));
            end;
        5 : begin
              Rouge:=Trunc(Int(Max));
              Vert:=Trunc(Int(Min));
              Bleu:=Trunc(Int(Min+(6-T0)*Delta));
            end;
      end;
    Ce code me génere une erreur ...

    ---------------------------
    Notification des exceptions du débogueur
    ---------------------------
    Le projet Editeur.exe a déclenché la classe d'exception EAccessViolation avec le message 'Violation d'accès à l'adresse 00000000. Lecture de l'adresse 00000000'.
    ---------------------------

    Si quelqu'un a une solution ... Je précise que quand je travaillais avec Pixels, j'avais presque les memes procedures, et ca marchait tres bien !
    Ca fait un moment que je cherche, en vain. J'ai trouvé plein d'exemples, mais ca ne marche toujours pas !

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Bonjour,

    il y a plusieurs erreurs qui me font penser que

    1) tu n'as pas tout compris aux objets Delphi
    2) tu dois connaitre un autre langage qui n'a pas la même logique

    voici donc quelques précisions

    1) ce qu'une fonction retourne est accessible en lecture/écriture par le mot clé Result, il n'est donc pas nécessaire de déclarer IModif et Resultat

    2) dans AjusterLumImage tu renvoies un pointeur sur un TBitmap que tu détruis juste après ! (les 2 dernières lignes)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Ok merci pour le coup du Result !

    Je viens juste de commencer avec les pointeurs, donc c'est possible que je fasse des trucs incohérents. Je ne vois pas de quel pointeur tu parles, si tu pouvais me donner plusieurs précisions a ce sujet ... Pendant ce temps, je vais tester quelques trucs !

    Merci de ta réponse !

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    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
     
    function AjusterLumImage(I :TBitmap; Correction: Integer):TBitmap;
    var X, Y :integer;
        Ligne : pRGBTripleArray;   //Scanline
    //    IModif :TBitmap;
    begin
      {IModif} Result :=TBitmap.Create;
      Result.Assign(I);
      Result.PixelFormat := pf24bit;
     
      for Y:=0 to Result.Height-1 do
      begin
        Ligne:=Result.ScanLine[Y];
        for X:=0 to Result.Width-1 do
          Ligne[X]:=AjusterLumPixel(Ligne[X],Correction);
      end;
    //  AjusterLumImage:=IModif;
    //  IModif.Free;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Je viens juste de la changer aussi !

    Et je suis super dégouté ... Je cherchais l'erreur PARTOUT SAUF la ! rien que le fait de modifier et de passer a Result a marché !

    Merci beaucoup ! Je vais pouvoir enfin continuer ...
    Si tu as des idées d'optimisations, ou quelqu'un d'autre, faites le moi savoir !

    Encore merci !

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

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