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

Delphi Discussion :

Scanline - RGB


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 246
    Points : 67
    Points
    67
    Par défaut Scanline - RGB
    Bonjour les amis,
    J'essaie de retranscrire du code Delphi en RealBasic et je rencontre un problème dans l'utilisation de la fonction ScanLine.
    La couleur imprimée de chaque pixel correspond bien à l'image de départ et dans mon esprit la couleur de chaque élément de la ScanLine devrait être identique à la couleur du pixel mais là je n'obtiens pas la même valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Scan_Image := PLongArray(Image.ScanLine[Image.Height-1]);
     
    For j:=0 to Image.Height-1 Do
    For i:=0 to Image.Width-1 Do
     Writeln(Fichier_Test, 'Pixel('+IntToStr(i)+','+IntToStr(j)+ '): '
                                 + IntToStr(Image.Canvas.Pixels[i,j])
                                 + ' - ScanLine : ' + IntToStr(Scan_Image[i+j*Width]));
    Voyez-vous où se situe mon erreur?
    Petite question subsidiaire: Delphi travaille en BGR lorsqu'on imprime la valeur d'une couleur?

    Merci à vous.

  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 445
    Points
    28 445
    Par défaut
    et bien en fait ça dépend du PixelFormat du bitmap, ton code ne fonctionnera que sur une image 32bits
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Tu as deux erreurs :

    RGB = 24 bits, un PLongArray ne va pas le faire. Il faut utiliser un pointeur compatible : PRGBTriple (pointeur sur 3 octets).

    Une ligne de bitmap est toujours multiple de 32 bits quelque soit la profondeur des couleurs. Dès lors, utiliser Bmp.Width ne peut fonctionner qu'avec un bitmap 32 bits. Dans les autres cas, il faut calculer la longeur de ligne (stride en anglais) par (Bmp.Width *24{bits} +31) div 32 *4) ou (Bmp.Width *3{octets} +3) and $FFFC.



    Je n'ai pas compris la question subsidiaire mais en mémoire TColor est stockée sous la forme RGB. Le bitmap sera lui en BGR.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 246
    Points : 67
    Points
    67
    Par défaut
    Voici les déclarations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TLongArray = Array[0..65535] of integer;
    PLongArray = ^TLongArray;
     
    Image.PixelFormat := pf32bit;
    On est bien en 32 bits.

    Pour ce qui concerne l'affichage des couleurs, lorsque j'imprime la couleur des pixels j'obtiens par exemple:
    $0000F2FF Red: 255 Green: 242 Blue : 0
    Donc le R se retrouve à la fin et le B au début de la chaîne --> BRG

    Je ne pige toujours pas pourquoi la couleur d'un pixel est différente dans l'image et dans la ScanLine.

  5. #5
    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 445
    Points
    28 445
    Par défaut
    dans Scan_Image[i+j*Width] ça ne serait pas plutôt Scan_Image[i+j*Image.Width] ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 246
    Points : 67
    Points
    67
    Par défaut
    Width représente Image.Width


  7. #7
    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 445
    Points
    28 445
    Par défaut
    est-ce que tu peux faire un mini projet avec ton code, car je suis arrivé aux limites de mon compilateur mental virtuel
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 694
    Points : 13 130
    Points
    13 130
    Par défaut
    Citation Envoyé par BBouille Voir le message
    $0000F2FF Red: 255 Green: 242 Blue : 0
    Donc le R se retrouve à la fin et le B au début de la chaîne --> BRG
    RGB c'est offset=R, offset+1=G, offset+2=B. Tu considères maintenant cette valeur comme un entier et l'affiche en héxa ; R est l'octet de poids faible de l'entier et apparait à droite.

    Ce que tu récupères d'un Scanline n'est pas compatible COLORREF mais Pixels[] se charge de le remettre en forme.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 246
    Points : 67
    Points
    67
    Par défaut
    Voilà Paul, j'ai fait un truc le plus concis possible.
    Merci Andnotor tu réponds à mes interrogations même si ça me paraît quand même déroutant.
    Je vais essayer de continuer comme ça alors.
    Merci à vous.
    Fichiers attachés Fichiers attachés

  10. #10
    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 445
    Points
    28 445
    Par défaut
    alors en fait si tu changes test Scan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Writeln(Fichier_Test, 'Pixel('+IntToStr(i)+','+IntToStr(j)+ ') Pict_In: ' + ColorToString(Pict_In.Canvas.Pixels[i,j])
     + ' - Scan_In : ' + ColorToString(Scan_In[i+j*Width]));
    tu obtients
    Pixel(0,0) Pict_In: clBlack - Scan_In : $00880015
    Pixel(1,0) Pict_In: clRed - Scan_In : $00EFE4B0
    Pixel(2,0) Pict_In: $0000F2FF - Scan_In : $0022B14C
    Pixel(3,0) Pict_In: $004CB122 - Scan_In : $00FFAEC9
    Pixel(4,0) Pict_In: $00E8A200 - Scan_In : $00B5E61D
    Pixel(0,1) Pict_In: $00C9AEFF - Scan_In : $0099D9EA
    Pixel(1,1) Pict_In: $000EC9FF - Scan_In : $00FFAEC9
    Pixel(2,1) Pict_In: $00150088 - Scan_In : $003F48CC
    Pixel(3,1) Pict_In: $00BE9270 - Scan_In : clBlack
    Pixel(4,1) Pict_In: $001DE6B5 - Scan_In : clBlue
    Pixel(0,2) Pict_In: $00E7BFC8 - Scan_In : $00C8BFE7
    Pixel(1,2) Pict_In: $007F7F7F - Scan_In : $007F7F7F
    Pixel(2,2) Pict_In: $004CB122 - Scan_In : $0022B14C
    Pixel(3,2) Pict_In: $00A449A3 - Scan_In : $00A349A4
    Pixel(4,2) Pict_In: $00E7BFC8 - Scan_In : $00C8BFE7
    Pixel(0,3) Pict_In: $00EAD999 - Scan_In : $00FFAEC9
    Pixel(1,3) Pict_In: $00C9AEFF - Scan_In : $00FFC90E
    Pixel(2,3) Pict_In: $00CC483F - Scan_In : $00880015
    Pixel(3,3) Pict_In: clBlack - Scan_In : $007092BE
    Pixel(4,3) Pict_In: clRed - Scan_In : $00B5E61D
    Pixel(0,4) Pict_In: $00150088 - Scan_In : clBlack
    Pixel(1,4) Pict_In: $00B0E4EF - Scan_In : clBlue
    Pixel(2,4) Pict_In: $004CB122 - Scan_In : $00FFF200
    Pixel(3,4) Pict_In: $00C9AEFF - Scan_In : $0022B14C
    Pixel(4,4) Pict_In: $001DE6B5 - Scan_In : $0000A2E8
    
    et si tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Writeln(Fichier_Test, 'Pixel('+IntToStr(i)+','+IntToStr(j)+ ') Pict_In: ' + ColorToString(Pict_In.Canvas.Pixels[i,j])
     + ' - Scan_In : ' + ColorToString(Scan_In[i+(Height - j - 1)*Width]));
    tu obtiens
    Pixel(0,0) Pict_In: clBlack - Scan_In : clBlack
    Pixel(1,0) Pict_In: clRed - Scan_In : clBlue
    Pixel(2,0) Pict_In: $0000F2FF - Scan_In : $00FFF200
    Pixel(3,0) Pict_In: $004CB122 - Scan_In : $0022B14C
    Pixel(4,0) Pict_In: $00E8A200 - Scan_In : $0000A2E8
    Pixel(0,1) Pict_In: $00C9AEFF - Scan_In : $00FFAEC9
    Pixel(1,1) Pict_In: $000EC9FF - Scan_In : $00FFC90E
    ...
    
    ce qui te montre deux choses, premièrement le bitmaps on la tête en bas, et ScanLin et Pixels ont des composantes couleur inversés: ARGB et ABGR
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 246
    Points : 67
    Points
    67
    Par défaut
    Super Paul, merci!
    Ah ben dis donc c'est quand même tordu tout ça, il y a sûrement une logique mais ce n'est pas évident lorsqu'on fait des tests ou des comparaisons.
    Je vais essayer de remettre tout ça dans "mon" ordre ou .
    Merci encore.

Discussions similaires

  1. Rotation de Bitmap -> ScanLine
    Par jujuesteban dans le forum Langage
    Réponses: 7
    Dernier message: 03/07/2003, 15h11
  2. Décomposition RGB
    Par Claythest dans le forum Langage
    Réponses: 3
    Dernier message: 16/06/2003, 11h35
  3. Changer les couleurs de la palette avec du RGB
    Par le mage tophinus dans le forum x86 16-bits
    Réponses: 11
    Dernier message: 13/01/2003, 08h55
  4. [Kylix] RGB d'un pixel
    Par Kusanagi dans le forum EDI
    Réponses: 1
    Dernier message: 13/11/2002, 20h33
  5. TObject->Color et composantes RGB
    Par Flo. dans le forum C++Builder
    Réponses: 10
    Dernier message: 14/06/2002, 17h07

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