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 :

[D7] Copie de Bitmap


Sujet :

Langage Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut [D7] Copie de Bitmap
    Bonjour,

    j'ai un Bitmap Bmp1 (320 x 320 pixels) et un Bitmap Bmp2 (32 x 32 pixels). Je cherche à copier un pixel sur 10 de Bmp1 vers Bmp2.

    J'ai une violation d'accès dans ce code lorsque y = 0, i = 0, x = 110, i = 11 :

    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
    Const
      PixelCountMax = 32768;
     
    Type
      pRGBTripleArray = ^TRGBTripleArray;
      TRGBTripleArray = ARRAY[0..PixelCountMax-1] OF TRGBTriple;
    ...
     
    procedure TF_Princ.FormCreate(Sender: TObject);
    begin
      Bmp1 := TBitMap.Create ;
      Bmp1.width := 320 ;
      Bmp1.Height := 320 ;
      Bmp1.PixelFormat := pf24bit;
      Bmp2 := TBitMap.Create ;
      Bmp2.width := 32 ;
      Bmp2.Height := 32 ;
      Bmp2.PixelFormat := pf24bit;
    end;
    ...
     
    Procedure TF_Princ.Copier ;
    Var
      x, y    : Integer;
      i, j    : Integer ;
      P1, P2  : pRGBTripleArray ;     // PByteArray;
    Begin
        j := 0 ;
        y := 0 ;
        While y <= (Bmp1.Height -1) do
          Begin
            x := 0 ;
            i := 0 ;
            Label1.Caption := Format('y : %d  j : %d  x : %d  i  : %d',[y, j, x, i]) ;
            Application.ProcessMessages ;
            P1 := Bmp1.ScanLine[y];
            P2 := Bmp2.ScanLine[j];
            While x <= (Bmp1.Width -1) do
              Begin
                P2[i] := P1[x] ;
                Inc(i) ;
                Inc(x,10) ;
            Label1.Caption := Format('y : %d  j : %d  x : %d  i  : %d',[y, j, x, i]) ;
            Application.ProcessMessages ;
              End;
            Inc(j) ;
            Inc(y,10) ;
          End;
        Image2.Picture.Bitmap.Assign(Bmp2);
    End ;
    Je ne comprends pas pourquoi ?

    avec au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     P1, P2  : pRGBTripleArray ;
    je n'ai pas de violation, mais le résultat dans image2 ne prend que 25% de l'image en largeur ?

    Avez vous une idée ?

    Merci
    A+
    Charly

  2. #2
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Bonjour,

    pour utiliser PByteArray il faut adapter le code comme ceci:
    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
    procedure TForm6.Copier;
    var
      x, y         : Integer;
      i, j         : Integer;
      P1, P2       : PByteArray; //       pRGBTripleArray ;
    begin
      j := 0;
      y := 0;
      while y <= (Bmp1.Height - 1) do
      begin
        x := 0;
        i := 0;
        Label1.Caption := Format('y : %d  j : %d  x : %d  i  : %d', [y, j, x, i]);
        Application.ProcessMessages;
        P1 := Bmp1.ScanLine[y];
        P2 := Bmp2.ScanLine[j];
        while x <= (BytesPerScanline(Bmp1.Width, 24, 32) - 1) do
        begin
          P2[i] := P1[x];
          P2[i + 1] := P1[x + 1];
          P2[i + 2] := P1[x + 2];
          Inc(i, 3);
          Inc(x, 30);
          Label1.Caption := Format('y : %d  j : %d  x : %d  i  : %d', [y, j, x, i]);
          Application.ProcessMessages;
        end;
        Inc(j);
        Inc(y, 10);
      end;
      Image2.Picture.Bitmap.Assign(Bmp2);
    end;
    Cordialement,
    @+

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Si ça peut aider, je mets le mini projet en ligne :

    TestImage.zip

    A+
    Charly

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Merci Cirec, mais avec ton code j'ai à nouveau un acess Violation ?

    A+
    Charly

    PS pourquoi 30 ? est ce que ScanLine multiplie la taille par 3 ?
    (Ce sont les 3 composantes du pixel ?)

  5. #5
    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 126
    Points
    13 126
    Par défaut
    Ce qui donne un rapport 3. Clairement tu passes d'un PixelFormat de 24 en 8 bits. Si tu charges une image il faut fixer le PixelFormat après chargement.

    Citation Envoyé par Charly910 Voir le message
    ... mais le résultat dans image2 ne prend que 25% de l'image en largeur ?
    Un tiers de la ligne en octet précisément puisque tu passes d'un TRGBTriple (3 octets) en byte. Les indices ne sont plus corrects pour du 24 bits, tu ne traites plus un pixel entier mais une seule composante à la fois.

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Effectivement c'est bien cela c'est à cause du loadfromFile. Si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Bmp1.LoadFromFile('Modele2.Bmp');
      Bmp1.width := 320 ;
      Bmp1.Height := 320 ;
      Bmp1.PixelFormat := pf24bit;
    ça marche

    Merci à tous les deux

    A+
    Charly

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

Discussions similaires

  1. [Débutant] Copy Paste d'un bitmap dans cellule excel
    Par Romain_76 dans le forum VB.NET
    Réponses: 2
    Dernier message: 20/03/2015, 08h12
  2. Meilleur fonction de copie d'image dans un bitmap
    Par LaDentDeLait dans le forum Langage
    Réponses: 2
    Dernier message: 26/09/2010, 02h38
  3. Réponses: 9
    Dernier message: 03/09/2006, 23h25
  4. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41
  5. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

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