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

Lazarus Pascal Discussion :

[Linux] Vérifier la couleur d'un pixel sans lag [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut [Linux] Vérifier la couleur d'un pixel sans lag
    Bonjour,

    Je tente ma chance, peut-être que quelqu'un sait comment on résout mon problème.

    Pour mon école (Insa Iyon), je dois réaliser un projet d'informatique. Le but du mien est de réussir a réaliser un jeu du genre Worms. Pour réussir a avoir des terrain destructibles, nous utilisons un un array[0..2000,0..500] of integer rempli de 1 (pour le sol) et de 0 (pour là où il n'y a rien). L'idée pour remplir cette matrice serait de faire une image (avec gimp par exemple) en .bmp avec 2 couleurs (pour faire simple on a fait noir et blanc). Puis on l'ouvre dans un tbitmap dans le programme et avec une boucle for on compare la couleur de chaque pixel de l'image et si on a un pixel blanc on met un 0 dans la matrice et si on a un pixel noir on met un 1. Je mets le code pour que ce soit plus simple.
    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
     
    const tailleimagex=2000;
    const tailleimagey=500;
     
    type cmatricecollision  =  class
      public
        mat:array[0..tailleimagex,0..tailleimagey] of integer;
        constructor createterrain();
        end;
     
    implementation
     
    constructor cmatricecollision.createterrain;
    var i,j:integer;  var image:TBitmap;
    begin
    image :=TBitmap.create;
    image.loadFromFile ('images/terrains/T1.bmp');
         for i:=1 to tailleimagex-1 do begin
            for j:=1 to tailleimagey-1 do begin
                case image.canvas.pixels[i,j] of
                     clwhite: mat[i,j]:=0;
                     clblack: mat[i,j]:=1;
                 end;
            end;
         end;
    end;
    Donc vous pouvez tester, ceci marche parfaitement... sur Windows. Mon problème vient du fait que pour l'école on me demande d'exécuter le programme sur Linux. Et là, horreur, à l'exécution le programme ne s'exécute pas (on voit le tform sans rien dedans).
    La raison est que la ligne 'case image.canvas.pixels[i,j] of' lague énormément. Je m'en suis rendu compte quand j'ai enlevé des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if image.canvas.pixels[i,j]=clwhite
    à un autre endroit du programe (je m'en servais pour avoir à afficher moins de pixels lors du rafraîchissement d'une partie de l'image mais vérifier la valeur d'un pixel avec ce if lague au moins 20 fois plus que de faire un image.canvas.pixels[i,j]:=clcolor !!). Quand je dis lag, je parle en temps pris pour exécuter la ligne lors de l'utilisation du programme (j'ai fait des test avec des timers).

    Donc je voudrais savoir si quelqun connaît une commande qui me renvoie la couleurs du pixel (soit sous le format clcolor ou en rgb ou autre, je trouverai bien comment le convertir) autre que image.canvas.pixels[i,j]. Ou si quelqu'un a une idée de comment l'utiliser d'une façon à ne pas provoquer de lag.

    Je rappelle que ce problème n'existe que sous Linux, et que la réponse n'est pas un problème de capacité du PC (j'ai testé avec plusieurs et de toute façon le PC qui devra exécuter le programme n'est pas vraiment fantastique).

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    SCANLINE !

    je te laisse chercher.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    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 865
    Points : 11 334
    Points
    11 334
    Billets dans le blog
    6
    Par défaut
    voici une idée "bizarre" : transformer élément par élément un tableau de clWhite/clBlack en tableau de 0/1

    ne serait-il pas plus rapide de copier la zone mémoire du Canvas dans celle du tableau de collision, quitte à faire ensuite un balayage pour mettre les clWhite à 0 et clBlack à 1 ?

    je crois que Lazarus n'implémente pas les ScanLine comme Delphi (il y a des posts sur le sujet) et que le BitMap n'est pas accessible de la même façon (transtypage ?). je verrai si je retrouve qqch.
    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 !

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 865
    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 865
    Points : 11 334
    Points
    11 334
    Billets dans le blog
    6
    Par défaut
    Voici 2 liens vers des solutions ou des pistes pour émuler les ScanLines de Delphi :

    http://www.developpez.net/forums/d11...e/#post6437956

    http://www.developpez.net/forums/d75...p/#post4355093

    A vérifier si ça fonctionne aussi bien sous Windows que sous Linux
    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 !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    ne serait-il pas plus rapide de copier la zone mémoire du Canvas dans celle du tableau de collision, quitte à faire ensuite un balayage pour mettre les clWhite à 0 et clBlack à 1 ?
    Quelqu'un m'en avait parlé mais sur le coup j'avais rien compris^^.

    Je vais tenter de voir comment marche le TLazIntfImage

    Merci beaucoup pour le réponses rapides

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bon alors j'ai réussit a faire un truc qui passe pas mal au niveau du lag (c'est pas le mieu mais je voulait éviter de faire des copier coller de codes déjà fait car c'est tout de même pour un projet).

    Bon si quelqun à le même problème que moi la meilleure solution reste le tfastbitmap si j'ai bien compris. Moi je suis resté au tlazintfimage qui à l'avantage de marcher à coup sur sur windows et linux tout en restant assez simple à utiliser. dessous je met le code de création de l'image à partir d'une image bitmap pour ma part.

    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
    unit matcolli;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
        Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, crt,
        StdCtrls, Buttons, IntfGraphics, LCLType, LCLProc, LCLIntf, GraphType;
     
    const tailleimagex=2000;
    const tailleimagey=1000;
     
    type cmatricecollision  =  class
      public
        mat:array[0..tailleimagex,0..tailleimagey] of integer;
        aimage:TLazIntfImage;
        constructor createterrain();
        end;
     
    implementation
     
    constructor cmatricecollision.createterrain;
    var  lRawImage: TRawImage;
         i,j:integer;
    begin
      // create a TLazIntfImage with 32 bits per pixel, alpha 8bit, red 8 bit, green 8bit, blue 8bit,
      // Bits In Order: bit 0 is pixel 0, Top To Bottom: line 0 is top
      lRawImage.Init;
      lrawimage.Description.Init_BPP32_B8G8R8A8_BIO_TTB(0,0);
      lRawImage.CreateData(false);
      AImage := TLazIntfImage.Create(0,0);
      try
        AImage.SetRawImage(lRawImage);                       // Load an image from disk.
        AImage.LoadFromFile('./images/terrains/plateforme.bmp');   // It uses the file extension to select the right registered image reader.
        debugln(['imagecreator ',AImage.Width,' ',AImage.Height]);        // The AImage will be resized to the width, height of the loaded image.
      finally
        for i:=0 to tailleimagex-1 do begin
            for j:=0 to tailleimagey-1 do begin
                 if fpcolortotcolor(aimage.colors[i,j])=clblack then begin
                   mat[i,j]:=1;
                   aimage.colors[i,j]:=tcolortofpcolor(clgreen);
                 end;
            end;
         end;
      end;
    end;
    et de comment la charger dans un tbitmap pour l'utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure tform1.afficheterrain(mat:cmatricecollision);
    var i,j:integer;
        bitmapdepassage:tbitmap;
    begin
       bitmapdepassage:=tbitmap.create;
       bitmapdepassage.LoadFromIntfImage(matcol.AImage);
       image1.canvas.draw(0,0,bitmapdepassage);
    end;
    je précise le timage est au bonnes dimentions car j'ai des constantes.

    Ya juste une ligne que je comprend pas, je l'ai laissée pour voir si quelqu'un arrive à me l'expliquer. C'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        debugln(['imagecreator ',AImage.Width,' ',AImage.Height]);
    Bon alors si j'ai bien compris c'est supposer m'afficher ce qui ya dans les parenthèses. Mais où? je suis pas arrivé à le trouver. Mais bon si personne ne sait au pire c'est pas trop grave.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 29/01/2012, 17h51
  2. Réponses: 2
    Dernier message: 14/06/2008, 00h21
  3. [TBitmap] Recuperer la couleur d un pixel
    Par DamessS dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/12/2004, 08h47
  4. [VB6] Comment récupérer la couleur d'un pixel de l'écran?
    Par Taurëndil dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 26/03/2004, 08h02
  5. Obtenir la couleur d'un pixel
    Par GLDavid dans le forum OpenGL
    Réponses: 2
    Dernier message: 09/03/2004, 18h21

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