1. #1
    Membre averti

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 189
    Points : 407
    Points
    407

    Par défaut Problèmes lors du chargement de fichiers BMP

    Bonsoir,

    J'ai un soucis qui me prend la tête depuis une semaine et je n'arrive pas à trouver d'ou cela peux venir.

    Apres les fichiers XPM que je charge et affiche parfaitement (le plus gros fichier XPM que j'ai testé faisait environ 32Mo et les dimensions du bitmap étaient de 3963x2642 ! ) je le précise pour la suite.

    Donc jusque la pas pas de soucis mais avec le format BMP 24Bits uniquement pour le moment. Alors, comment dire ? Je lis (correctement certain fichiers). Petites captures :
    Nom : 2017-05-14_184040.jpg
Affichages : 76
Taille : 73,7 Ko

    Mais lorsque je souhaite charger le même fichier dont j'ai simplement augmenté les dimensions par 2 sous MSPaint ou d'autres fichiers ben la c'est la cata

    Regardez j'ai placé un showmessage juste pour stopper avant un bon gros SIGSEGV

    Nom : 2017-05-14_185348.jpg
Affichages : 68
Taille : 56,3 Ko

    Puis SIGSEGV avec ça comme infos

    Nom : 2017-05-14_185421.jpg
Affichages : 69
Taille : 43,2 Ko

    Juste pour vous montrer que les infos sont chargées j'ai désactivé le code qui génère le chargement des données
    Nom : 2017-05-14_185619.jpg
Affichages : 69
Taille : 72,8 Ko

    Ensuite avec d'autre fichier le projet se gel en me mettant çà
    Nom : 2017-05-14_192206.jpg
Affichages : 67
Taille : 51,5 Ko
    Nom : 2017-05-14_192235.jpg
Affichages : 68
Taille : 49,6 Ko


    Maintenant voila le code de chargement de l'en-tête des fichiers BMP :

    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    function TGLZBitmapBMPImage.ReadImageProperties:Boolean;
    Var
      UsedColors:Integer;
    begin
      Result:=True;
     
      //ShowMessage('ReadImageProperties');
     
      // On lit le bon en-tête
      Case FHeaderSize Of
        12:
          begin
            FHeaderType := bmpht_Os21x;
            Memory.Read(FInfoHeader.Os21x,12);
          end;
        40:
          begin
            FHeaderType := bmpht_WindowsV1;
            Memory.Read(FInfoHeader.WindowsV1,36);
            ShowMessage('Dimension : '+inttostr(FInfoHeader.WindowsV1.biWidth)+'x'+inttostr(FInfoHeader.WindowsV1.biHeight));
          end;
        52:
          begin
            FHeaderType := bmpht_WindowsV2;
            Memory.Read(FInfoHeader.WindowsV2,48);
          end;
        56:
          begin
            FHeaderType := bmpht_WindowsV3;
            Memory.Read(FInfoHeader.WindowsV3,52);
          end;
        64:
          begin
            FHeaderType := bmpht_Os22x;
            Memory.Read(FInfoHeader.Os22x,60);
          end;
        108:
          begin
            FHeaderType := bmpht_WindowsV4;
            Memory.Read(FInfoHeader.WindowsV4,104);
          end;
        124:
          begin
            FHeaderType := bmpht_WindowsV5;
            Memory.Read(FInfoHeader.WindowsV5,120);
          end;
           Else Showmessage('Taille de l''en-tête invalide = '+Inttostr(FHeaderSize));
      End;
     
      // On calcul combien d'octets on à lu dans le fichier (servira pour la calcul des "GapSize"
      FInternalReadSize:=14+FHeaderSize;
     
      // On récupère les infos basiques
      bmpWidth:=GetHeaderWidth;
      bmpHeight := GetHeaderHeight;
      BitCount:= GetHeaderBitCount;
      TopDown:=(bmpHeight<0);
      bmpHeight:=abs(bmpHeight);
     
      // Pas de pixel on sort
      if (bmpWidth =0) and (bmpHeight = 0) then
      begin
        ShowMessage('Dimensions Incorrectes');
        Result:=False;
      end;
     
      { On connait ou se trouve les données, on sait combien de données on a lu
        On peut donc déterminer le 1er "GapSize" c'est à dire l'espace perdu entre
        les donnée de la palette et les données. Le GapSize peut-être égal à 0.
      }
      if ((FInternalReadSize)>FBMPFileHeader.bfOffBits) then
      begin
        ShowMessage('Erreur de lecture dans le fichier');
        Result:=False;
      end
      else
      begin
        GapSize1 := FBMPFileHeader.bfOffBits-FInternalReadSize;
      end;
     
      // On fait un 1er test sur la valeur "Compression"
      Compression:=GetHeaderCompression;
      if not (Compression in [BMP_COMPRESSION_NONE..BMP_COMPRESSION_ALPHABITF]) then
        begin
         ShowMessage('Erreur : Compression Valeure inconnue');
         Result:=False;
        end;
      { La compression PNG est uniquement supporté par Windows et  par les fonction StrechBits et
        pour l'affichage cf pour plus d'informations : https://msdn.microsoft.com/en-us/library/dd145023(VS.85).aspx
      }
      if (Compression=BMP_COMPRESSION_PNG) then
       begin
         ShowMessage('Erreur : Compression PNG non supportée');
         Result:=False;
        end;
     
      { Idem ci-dessus sauf si le fichier est de Type OS2 version en-tete 2.
        Dans ce cas la compression peut-être activer uniquement pour le format 24bits.
        L'algorithme utilisé sera alors le RLE 24bits
      }
      if not(FHeaderType = bmpht_Os22x) and (Compression=BMP_COMPRESSION_JPEG) then
        begin
         ShowMessage('Erreur : Compression JPEG non supportée');
         Result:=False;
        end;
     
     
        { On a récupéré nos informations, on met à jour le  RawImage.
           On charge la palette de couleur si besoins
           On initialise quelques variables utiles pour la lecture des données suivant
           le "PixelFormat"
         }
         With RawImage do
         begin
           UsedColors:=GetHeaderUsedColors;
           UsePalette:=False;
     
           Case bitCount of
             1:
             begin
               Description.PixelFormat:=pf1Bit;
               UsedColors:=GetHeaderUsedColors;
               if (UsedColors>0) then
                 if (UsedColors=2) then
                 begin
                   UsePalette:=True;
                   PaletteCount:=2;
                   //SetLength(PaletteEntries,8);
                 end
                 else
                 begin
                   ShowMessage('Bad Palette');
                   Result:=False;
                 end;
             end;
             2:
             begin
               Description.PixelFormat:=pf2Bits;
               UsePalette:=True;
               PaletteCount:=4;
              // UsedColors:=GetHeaderUsedColors;
               if (UsedColors>0) and (UsedColors<=PaletteCount) then
               begin
                 PaletteCount :=UsedColors;
                 //SetLength(PaletteEntries,PaletteCount*4);
               end
               else if (UsedColors>PaletteCount) then
               begin
                 ShowMessage('Bad Palette');
                 Result:=False;
               end;// else SetLength(PaletteEntries,16);
             end;
             4:
             begin
               Description.PixelFormat:=pf4Bits;
               UsePalette:=True;
               PaletteCount:=16;
              // UsedColors:=GetHeaderUsedColors;
               if (UsedColors>0) and (UsedColors<=PaletteCount) then
               begin
                 PaletteCount :=UsedColors;
                 //SetLength(PaletteEntries,PaletteCount*4);
               end
               else if (UsedColors>PaletteCount) then
               begin
                 ShowMessage('Bad Palette');
                 Result:=False;
               end;// else SetLength(PaletteEntries,64);
     
               if Not(Compression=BMP_COMPRESSION_NONE) and not(Compression=BMP_COMPRESSION_RLE4) then
               begin
                 ShowMessage('Bad Compression');
                 Result:=False;
               end;
             end;
             8:
             begin
               Description.PixelFormat:=pf8Bits;
               UsePalette:=True;
               PaletteCount:=256;
             //  UsedColors:=GetHeaderUsedColors;
               if (UsedColors>0) and (UsedColors<=PaletteCount) then
               begin
                 PaletteCount :=UsedColors;
                 //SetLength(PaletteEntries,PaletteCount*4);
               end
               else if (UsedColors>PaletteCount) then
               begin
                 ShowMessage('Bad Palette');
                 Result:=False;
               end;// else SetLength(PaletteEntries,1024);
     
               if Not(Compression=BMP_COMPRESSION_NONE) and not(Compression=BMP_COMPRESSION_RLE8) then
               begin
                ShowMessage('Bad Compression');
                Result:=False;
               end;
             end;
             16:
             begin
               Description.PixelFormat:=pf16Bits;
               if Not(Compression=BMP_COMPRESSION_NONE) and not(Compression=BMP_COMPRESSION_BITF) then
               begin
                ShowMessage('Bad Compression');
                Result:=False;
               end;
               if (Compression=BMP_COMPRESSION_NONE) then
               begin
                 //format XRGB 1555
                 RedMask := $7C00;
                 GreenMask := $03E0;
                 BlueMask := $001F;
                 RedShift := 7;
                 GreenShift := 2;
                 BlueShift := -3;
               end
               else
               begin
                 if (FHeaderType>bmpht_WindowsV1) then
                 begin
                   RedMask := GetHeaderRedMask;
                   GreenMask := GetHeaderGreenMask;
                   BlueMask := GetHeaderBlueMask;
                   RedShift := ShiftCount(RedMask);
                   GreenShift := ShiftCount(GreenMask);
                   BlueShift := ShiftCount(BlueMask);
                 end;
               end;
             end;
             24:
             begin
               Description.PixelFormat:=pf24Bits;
               Description.ColorFormat:=cfBGR;
               if Not(Compression=BMP_COMPRESSION_NONE) and not(Compression=BMP_COMPRESSION_BITF) then
               begin
                ShowMessage('Bad Compression');
                Result:=False;
                // Sous avec la version de l'en-tête Os22x la compression JPEG correspond à une compression RLE (Uniquement pour les images 24Bits)
                if (FHeaderType = bmpht_Os22x) and (Compression=BMP_COMPRESSION_JPEG) then Result:=True;
               end;
               if (Compression=BMP_COMPRESSION_NONE) then
               begin
                 //Format BGR
                 BlueMask := $11000000;
                 GreenMask := $00110000;
                 RedMask := $00001100;
                 BlueShift := ShiftCount(BlueMask);
                 GreenShift := ShiftCount(GreenMask);
                 RedShift := ShiftCount(RedMask);
               end
               else
               begin
                  RedMask := GetHeaderRedMask;
                  GreenMask := GetHeaderGreenMask;
                  BlueMask := GetHeaderBlueMask;
                  RedShift := ShiftCount(RedMask);
                  GreenShift := ShiftCount(GreenMask);
                  BlueShift := ShiftCount(BlueMask);
               end;
             end;
             32:
             begin
               Description.PixelFormat:=pf32Bits;
               Description.ColorFormat:=cfBGRA;
               if Not(Compression=BMP_COMPRESSION_NONE) and not(Compression=BMP_COMPRESSION_BITF) then
               begin
                 ShowMessage('Bad Compression');
                 Result:=False;
               end;
               if (Compression=BMP_COMPRESSION_NONE) then
               begin
                 //Format ARGB
                 AlphaMask := $11000000;
                 RedMask := $00110000;
                 GreenMask := $00001100;
                 BlueMask := $00000011;
     
                 RedShift := ShiftCount(RedMask);
                 GreenShift := ShiftCount(GreenMask);
                 BlueShift := ShiftCount(BlueMask);
                 AlphaShift := ShiftCount(AlphaMask);
               end
               else
               begin
                  //if (FHeaderType>bmpht_WindowsV2) then
                  AlphaMask := $11000000;
                  RedMask := $00110000;
                  GreenMask := $00001100;
                  BlueMask := $00000011;
                  RedShift := ShiftCount(RedMask);
                  GreenShift := ShiftCount(GreenMask);
                  BlueShift := ShiftCount(BlueMask);
                  AlphaShift := ShiftCount(AlphaMask);
               end;
     
             end;
           end;
     
         UpdateSize(bmpWidth, bmpHeight);
           // Verification si le "BitField" est correcte par rapport
           // a un de nos formats de couleur
           // CheckColorFormatBitFields(rm,gm,bm,am: Integer; rs,gs,bs,as: Integer);
           // If Not(CheckColorFormatBitFields) then ....
        PaletteCount:=UsedColors;
        FRowSize:=ComputeBytesPerLine(bmpWidth, bitCount, bleDWordBoundary);
        FLineEndGapSize := FRowSize - (bmpWidth*3);
      //  Description.SwapRB:=true;
        if TopDown then Description.LineOrder :=bloTopToBottom
        else Description.LineOrder := bloBottomToTop;
     
      end;
    end;
     
    function TGLZBitmapBMPImage.CheckFormat(): Boolean;
     
    begin
      Result := False;
      Memory.Read(FBmpFileHeader,SizeOf(TGLZBMPFileHeader));
     
      With FBmpFileHeader do
      begin
        if (bfType= BMP_MAGIC_WINBMP)  or
               (bfType = BMP_MAGIC_OS2BMP)  or
               (bfType = BMP_MAGIC_OS21ICO) or
               (bfType = BMP_MAGIC_OS21CUR) or
               (bfType = BMP_MAGIC_OS22ICO) or
               (bfType = BMP_MAGIC_OS22CUR) then
           begin
              FHeaderSize:=Memory.ReadInteger;
              {$IFDEF FPC_BIG_ENDIAN}
               FHeaderSize := LEtoN(FHeaderSize);
              {$ENDIF}
              Result:= ReadImageProperties; // On Lit les propriétes de l'image
           end
           else ShowMessage('BMP INVALIDE');
      end;
    end;

    Et la procedure qui semble posé problème :

    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
    procedure TGLZBitmapBMPImage.LoadFromMemory();
    var
     X,Y,YY, LineSize : Integer;
     DstColor: TGLZColor;
     SrcColor : TGLZColorBGR_24;
     DstLine : PGLZColor;
     LineBuffer : PGLZColorBGR_24;
    begin
     
      // On initialise les dimensions de notre bitmap
      SetSize(bmpWidth, bmpHeight);
      LineSize:=Width*3;
      LineBuffer:=nil;    // Important sinon SIGSEGV
      // On Initialise notre buffer de ligne
      ReallocMem(LineBuffer,LineSize);
      Y:=0;
      X:=0;
      // On se placce sur la derniere ligne
      DstLine:=getScanLine(MaxHeight);
      // On lit la 1ere ligne du BMP
      Memory.Read(LineBuffer^,LineSize); // Ne pas oublier le "^" sinon SIGSEGV
      repeat
        DstColor.Red := LineBuffer^.Red;
        DstColor.Green := LineBuffer^.Green;
        DstColor.Blue := LineBuffer^.Blue;
        DstColor.Alpha:=255;
     
        // Ecriture du pixel
        if (Compression = BMP_COMPRESSION_BITF) then  DstLine^:=ConvertBitFieldsToGLZColor(DstColor.AsInteger)
        else
          begin
            DstLine^:=DstColor;
          end;
     
        // On Avance, on Avance
        Inc(X);
        // On est arrivé au bout de la ligne on passe à la suivante
        if X>MaxWidth then
        begin
          // On saute le padding de fin de ligne, si il existe
          if FLineEndGapSize>0 then Memory.Skip(FLineEndGapSize);
          // On lit la ligne suivante du BMP
          Inc(Y);
          if Y<=MaxHeight then Memory.Read(LineBuffer^,LineSize);
          // On se place sur la bonne ligne de notre bitmap
          if TopDown then DstLine:=getScanLine(y) else DstLine:=getScanLine(MaxHeight-y);
          X:=0;
        end else
        begin
          if (x<=MaxWidth) then
          begin
            Inc(LineBuffer);
            Inc(DstLine);
          end;
        end;
      Until (Y>MaxHeight);
     
      //Les lignes ci-dessous provoque une Erreur SIGSEGV incompréhensible et le bitmap ne s'affiche pas :(
      //ReAllocMem(LineBuffer, 0);
      //FreeMem(LineBuffer);
      //LineBuffer:=nil;
     
    end;
    le code de chargement dans le projet

    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
    procedure TForm1.Button2Click(Sender: TObject);
    Var
      Bitmap1 : TBitmap;
      GLZBmp :  TGLZBitmapBMPImage;
    begin
      if OpenPictureDialog.Execute then
      begin
        Bitmap1:=TBitmap.Create;
        Bitmap1.LoadFromFile(OpenPictureDialog.FileName);
        pnlBitmapView.Canvas.Draw(0,0,Bitmap1);
        Memo1.Text:= StringReplace(Bitmap1.RawImage.Description.AsString, ' ', LineEnding, [rfReplaceAll]);
        Bitmap1.free;
     
        GLZBmp:=TGLZBitmapBMPImage.Create(nil,0,0);
        GLZBmp.LoadFromFile(OpenPictureDialog.FileName);
        DrawGLZBitmapToCanvas(GLZBmp,pnlGLZBitmapView.Canvas,Rect(0,0,GLZBmp.Width,GLZBmp.Height), True,True);// En commentant cette ligne c'est pareil même erreur même combat
        Memo2.Text:=GLZBmp.RawImage.getDescriptionAsString+#13+#10+GLZBmp.getImagePropertiesAsString;
        GLZBmp.Free; // Ou En commentant celle là c'est la même chose
      end;
    end;

    Il semble qu'il y est un problème de mémoire mais je dispose d'un pc de bureau très confortable (16Go Ram).

    Mais je n'arrive pas a déceler ou. De plus à certain moment la valeur de ma variable "MaxHeight" qui est un propriété en lecture seule devient fausse et farfelue du genre 1119526.

    Avez vous déja été confronté à ce genre d'erreur ? Auriez vous quelques pistes que je devrait vérifier dans mon code ? car je patauge dans la semoule grave là
    Je comprend vraiment pas alors que j'arrive à charger des fichier XPM de très grande taille sans soucis.


    Merci d'avance
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  2. #2
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 431
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 431
    Points : 7 433
    Points
    7 433

    Par défaut

    Salut,

    Bon, ton code est plein de trucs à toi, il nous est donc impossible de tester quoi que ce soit.

    En plus on ne peut pas fouiller dans les bouts de code que tu fournis, puisqu'on ne sait pas, par exemple, ce qui se cache sous (3e code) : GLZBmp:=TGLZBitmapBMPImage.Create(nil,0,0); c'est donc un peu compliqué pour t'aider.

    Ceci étant dit, jette un œil à ces remarques :

    1er code :
    C'est un truc à toi, ça ? Description.ColorFormat:=cfBGRA; parce que moi, ce que je trouve dans l'aide du Web, c'est : Description.ColorFormat:=ricfRGBA;...


    2e code :
    Je ne comprends pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TGLZBitmapBMPImage.LoadFromMemory();
    var
     X,Y,YY, LineSize : Integer;
     DstColor: TGLZColor;
     SrcColor : TGLZColorBGR_24;
     DstLine : PGLZColor;
     LineBuffer : PGLZColorBGR_24;
    begin
     
      // On initialise les dimensions de notre bitmap
      SetSize(bmpWidth, bmpHeight);
      ...
    Il n'y a pas de with Object do begin... ? Donc on ne sait pas qui est concerné par SetSize et les lignes suivantes.

    Toujours dans cette procédure, LineSize:=Width*3;, 3 bytes par pixel, donc ? Parce que 10 lignes plus loin plus loin j'en compte 4 par pixel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        DstColor.Red := LineBuffer^.Red;
        DstColor.Green := LineBuffer^.Green;
        DstColor.Blue := LineBuffer^.Blue;
        DstColor.Alpha:=255;

    3e code :
    vu le 1er commentaire (// En commentant cette ligne c'est pareil même erreur même combat) sur la ligne qui dessine, j'en conclus que si tu commentes la ligne et que donc tu ne dessines pas, tu as une erreur. C'est bien ça ?

    D'habitude c'est plutôt l'inverse !

    Et j'ai trouvé ta description du problème un peu trop floue :
    Mais lorsque je souhaite charger le même fichier dont j'ai simplement augmenté les dimensions par 2 sous MSPaint ou d'autres fichiers ben la c'est la cata
    "le même fichier" que lequel ? Celui qui fait 3963x2642 ou un autre ?
    "ou d'autres fichiers", qu'est-ce qu'ils ont de particulier ?

    Je lis (correctement certain fichiers).
    Je suppose que tu voulais dire Je lis (correctement) certains fichiers.

    Ce qui veut dire qu'avec d'autres ça se passe mal : qu'est-ce que ces autres fichiers ont de différent par rapport à ceux qui n'ont pas de problèmes ?
    Si c'est une taille plus grande, tu devrais pouvoir trouver la taille à partir de laquelle le problème se manifeste : ça te mettra sur la piste...

    Et si tu ne t'en sors pas, essaye de virer tes GLZ... et repasse en TBitmap pur, juste pour voir si les algorithmes fonctionnent.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre averti

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 189
    Points : 407
    Points
    407

    Par défaut

    Citation Envoyé par Jipété Voir le message
    Salut,

    Bon, ton code est plein de trucs à toi, il nous est donc impossible de tester quoi que ce soit.

    En plus on ne peut pas fouiller dans les bouts de code que tu fournis, puisqu'on ne sait pas, par exemple, ce qui se cache sous (3e code) : GLZBmp:=TGLZBitmapBMPImage.Create(nil,0,0); c'est donc un peu compliqué pour t'aider.
    Oui c'est vrai c'est plein de truc à moi malheureusement je peux pas tout mettre car le projet est plutôt conséquent.
    Ce qui se cache sous Create n'est pas bien important à ce niveau. Le problème ne se situe pas là et n'apporte pas d'infos importantes ici.
    C'est vraiment dans la fonction LoadFromMemory que ça se joue. et comme d'hab c'est peut-être juste une petite erreur de frappe genre un double ;; ou ++ qui se compile mais peuvent
    au final créer des bugs. mais j'en doute très fortement.

    Citation Envoyé par Jipété Voir le message
    Ceci étant dit, jette un œil à ces remarques :

    1er code :
    C'est un truc à toi, ça ? Description.ColorFormat:=cfBGRA; parce que moi, ce que je trouve dans l'aide du Web, c'est : Description.ColorFormat:=ricfRGBA;...
    Rien à voir avec la description du RawImage de la LCL. cfBGRA et autres font partie de ma propre gestion des bitmaps.

    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
     TGLZColorFormat = (
                        cfCustom,
                        cfDevice,
                        cfDefault,
                        // pf1bits,pf8bits
                        cfMono,
                        // pf8bits, pf16bits, pf32bits, pf64bits
                        cfIndexed,
                        // pf8bits, pf16bits, pf32bits, pf64bits
                        cfGrayAlpha,
                        // pf16bits
                        cfXRGB_1555, cfRGBX_5551,
                        //cfXRGB_4444, cfRGBX_4444
                        cfRGB_565, cfBGR_565,
                        // pf24bits, pf48bits,
                        cfRGB, cfBGR,
                        // pf32bits, pf64bits
                        cfRGBA, cfBGRA,
                        cfABGR, cfARGB);
                        //formats spéciaux  pf64bits , pf96bits, pf128bits
                        (* cfRGBAFloat, cfBGRAFloat, cfARGBFloat, cf ABGRFLoat,
                        cfHSL, cfHSLA, cfHSV, cfHSVA,
                        cfYUV, cfCIELab, cfCIExyz, cfCMY, cfCMYK, cfPhotoYCC, cfYCbCr *)
    et voici la declaration des type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // Formats 24bits
        TGLZColorRGB_24 = packed record //32bit
          red,  green, blue : byte;
        end;
        PGLZColorRGB_24 = ^TGLZColorRGB_24;
     
        TGLZColorBGR_24 = packed record
          blue, green, red : byte;
        end;
        PGLZColorBGR_24 = ^TGLZColorBGR_24;
    Citation Envoyé par Jipété Voir le message
    2e code :
    Je ne comprends pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TGLZBitmapBMPImage.LoadFromMemory();
    var
     X,Y,YY, LineSize : Integer;
     DstColor: TGLZColor;
     SrcColor : TGLZColorBGR_24;
     DstLine : PGLZColor;
     LineBuffer : PGLZColorBGR_24;
    begin
     
      // On initialise les dimensions de notre bitmap
      SetSize(bmpWidth, bmpHeight);
      ...
    Il n'y a pas de with Object do begin... ? Donc on ne sait pas qui est concerné par SetSize et les lignes suivantes.
    C'est une procedure de l'objet lui même (de son ancêtre pour être exacte)

    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
    procedure TGLZCustomBitmap.SetSize(NewWidth, NewHeight : Integer);
    begin
     FWidth:=NewWidth;
     FHeight:=NewHeight;
     FSize:=(NewWidth*NewHeight)*4; 
     
     FMaxWidth:=FWidth-1;
     FMaxHeight:=FHeight-1;
     FMaxSize:=(FWidth*FHeight)-1;
     FCenterX:=(FWidth shr 1)-1;
     FCenterY:=(FHeight shr 1)-1;
     
     ReallocMem(FBitmapData,FSize);
     
     setLength(FScanLineLUT,FHeight);
     ComputeScanLineLUT;
     
    end;
    Citation Envoyé par Jipété Voir le message
    Toujours dans cette procédure, LineSize:=Width*3;, 3 bytes par pixel, donc ? Parce que 10 lignes plus loin plus loin j'en compte 4 par pixel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        DstColor.Red := LineBuffer^.Red;
        DstColor.Green := LineBuffer^.Green;
        DstColor.Blue := LineBuffer^.Blue;
        DstColor.Alpha:=255;
    LineSize:=Width*3; nombre d'octets de la ligne à lire dans le fichier bmp 24bits (BGR)
    DstColor c'est en 32bits car c'est le format de mon buffer de données pour l'affichage

    Citation Envoyé par Jipété Voir le message
    3e code :
    vu le 1er commentaire (// En commentant cette ligne c'est pareil même erreur même combat) sur la ligne qui dessine, j'en conclus que si tu commentes la ligne et que donc tu ne dessines pas, tu as une erreur. C'est bien ça ?

    D'habitude c'est plutôt l'inverse !
    C'est ça le truc comme on peux le voir sur la capture avec la "madonne" ça s'affiche et paf de suite une SIGSEGV qui sort de je ne sais ou. et dans la capture au dessus on vois bien que mes information sur le fichier sont bien afficher dans le memo si je commente entièrement la fonction LoadFromMemory

    Citation Envoyé par Jipété Voir le message
    Je suppose que tu voulais dire Je lis (correctement) certains fichiers.

    Ce qui veut dire qu'avec d'autres ça se passe mal : qu'est-ce que ces autres fichiers ont de différent par rapport à ceux qui n'ont pas de problèmes ?
    Si c'est une taille plus grande, tu devrais pouvoir trouver la taille à partir de laquelle le problème se manifeste : ça te mettra sur la piste...
    Oui c'est exactement ça, mais malheureusement non je peux pas trouver la taille car c'est toujours différent et les erreurs n'arrive pas au même moment.

    Citation Envoyé par Jipété Voir le message
    Et j'ai trouvé ta description du problème un peu trop floue :
    "le même fichier" que lequel ? Celui qui fait 3963x2642 ou un autre ?
    "ou d'autres fichiers", qu'est-ce qu'ils ont de particulier ?
    Celui qui fait 3963x2642 c'etait le XPM.
    Les fichier dont je parle sont ceux des captures
    Et justement c'est que entre ces fichiers il n'y a rien de particuliers mis à part leurs dimensions. Ce sont tous des bmp 24bits v1 sans compressions.
    C'est pour ça que j'ai précisé qu'avec le fichier XPM de 3963x2642 pas de soucis par rapport aux dimensions. Le chargement du XPM ce fait par le même processus que celui des présenter ici
    (CheckFormat --> ReadProperties --> LoadFromMemory)

    Le truc qui me chiffonne ce sont ces lignes commentés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Les lignes ci-dessous provoque une Erreur SIGSEGV incompréhensible et le bitmap ne s'affiche pas :(
      //ReAllocMem(LineBuffer, 0);
      //FreeMem(LineBuffer);
      //LineBuffer:=nil;
    et aussi pourquoi je suis obligé de faire
    ici avant le ReallocMem et si je le fais pas

    Citation Envoyé par Jipété Voir le message
    Et si tu ne t'en sors pas, essaye de virer tes GLZ... et repasse en TBitmap pur, juste pour voir si les algorithmes fonctionnent.
    Mes algos fonctionnent sinon rien ne s'afficherait
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  4. #4
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 431
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 431
    Points : 7 433
    Points
    7 433

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Le truc qui me chiffonne ce sont ces lignes commentés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Les lignes ci-dessous provoque une Erreur SIGSEGV incompréhensible et le bitmap ne s'affiche pas :(
      //ReAllocMem(LineBuffer, 0);
      //FreeMem(LineBuffer);
      //LineBuffer:=nil;
    SIGSEGV c'est parce que quelque chose n'est pas correctement initialisé.
    Essaye en n'en décommentant qu'une à la fois.


    Citation Envoyé par BeanzMaster Voir le message
    et aussi pourquoi je suis obligé de faire
    ici avant le ReallocMem et si je le fais pas
    Même remarque.

    Et pourquoi ReallocMem ? Pourquoi pas un SetLength ?

    Pas d'autres idées
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 388
    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 : 2 388
    Points : 3 735
    Points
    3 735

    Par défaut

    //Les lignes ci-dessous provoque une Erreur SIGSEGV incompréhensible et le bitmap ne s'affiche pas
    //ReAllocMem(LineBuffer, 0);
    //FreeMem(LineBuffer);
    //LineBuffer:=nil;
    le ReAllocMem à zéro m’étonne fortement
    surtout que dans mon souvenir le ReAllocMem s'utilise comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      LineBuffer := ReAllocMem(LineBuffer,maValeurDiffdeZero);

    dans ton cas je ferais simplement un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          if (LineBuffer <> nil) then
          begin
            if (FreeMem(LineBuffer) {$ifdef FPC}={$else}<>{$endif} 0) then
                System.RunError(204)
            LineBuffer := nil;
          end;

    PS en cherchant un peu je me suis un peu mélangé les pinceaux ^^
    bon la fonction proposé est correct
    le seul truc faux c'est le Reallocmen
    il fournit pas de pointeur c'est bien une procédure par contre quand tu le met a zéro tu détruit le pointeur cela revient a faire un FreeMem + une affectation à nil du pointeur
    donc impossible d'y faire référence ensuite ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        if (LineBuffer <> nil) then
        begin
            ReAllocMem(LineBuffer,0);
         end;
    c'est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          if (LineBuffer <> nil) then
          begin
             FreeMem(LineBuffer);
             LineBuffer := nil;
         end;
    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

  6. #6
    Membre averti

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 189
    Points : 407
    Points
    407

    Par défaut

    Citation Envoyé par anapurna Voir le message
    le seul truc faux c'est le Reallocmen
    il fournit pas de pointeur c'est bien une procédure par contre quand tu le met a zéro tu détruit le pointeur cela revient a faire un FreeMem + une affectation à nil du pointeur
    donc impossible d'y faire référence ensuite ...
    Non reallocmem ne détruit pas le pointeur Freemem oui. Mais quoi qu'il en soit si je laisse juste FreeMem(LineBuffer) ou ReAllocMem(LineBuffer,0) idem j'ai un bon gros SIGSEGV avec ça
    derriere. Alors que je ne libère à aucun moment "LineBuffer"


    Nom : 2017-05-15_144011.jpg
Affichages : 35
Taille : 53,1 Ko


    si je commente la ligne "LineBuffer := nil" au début de ma procédure paf avec ça dans les messages :
    glzimagefilebmp.pas(874,24) Hint: Local variable "LineBuffer" does not seem to be initialized incomprehensible c'est normal c'est un pointeur il est pas initialisé, normal je n'ai pas alloué (encore) la mémoire, c'est la ligne du dessous pfff
    Et même erreur que ci dessus

    Citation Envoyé par JIPETE
    Et pourquoi ReallocMem ? Pourquoi pas un SetLength ?
    Car c'est un pointer et non un Array PS j'ai aussi essayé avec un tableau et ça me donne les même erreurs.

    J'ai changé quelques fonctions avec comme résultats des LongWord j'ai changé par Integer (j'avais un truc dans les messages : glzimagefilebmp.pas(515,29) Hint: Converting the operands to "Int64" before doing the multiply could prevent overflow errors.).

    Je tente de charger le fichier "Eye.Bmp" (celui de DaveData, le gros oeil à Jipete ) et paf

    Nom : 2017-05-15_145740.jpg
Affichages : 36
Taille : 16,4 Ko

    et mon log de sorti ça plante à la 41eme ligne :
    [STATUS] Taille de l'en-tête : 108 --> Version 4
    [STATUS] Dimension : 532, 514
    [STATUS] LineSize : 1596
    [STATUS] GetScanLine : 513
    [STATUS] Write Pixel at : 0, 513
    [STATUS] Write Pixel at : 1, 513
    ...
    [STATUS] Write Pixel at : 529, 473
    [STATUS] Write Pixel at : 530, 473
    [STATUS] Write Pixel at : 531, 473
    [STATUS] MaxHeight : 513
    [STATUS] Y : 41
    [STATUS] Curr Line : 472
    [STATUS] GetScanLine : 472
    [STATUS] Write Pixel at : 0, 472 ---> La paf dans les dents

    si je teste avec le fichier (qui fonctionne, 1ere capture dans mon 1er post) que j'ai redimenssionner sous MSPaint et qui ne fait que 256x128 j'ai ça comme erreur
    Nom : 2017-05-15_150858.jpg
Affichages : 36
Taille : 9,8 Ko
    suivi de
    Nom : 2017-05-15_150916.jpg
Affichages : 37
Taille : 31,3 Ko

    dans mon log
    [STATUS] Taille de l'en-tête : 40 --> Version 1
    [STATUS] Dimension : 256, 128
    [STATUS] LineSize : 768
    [STATUS] GetScanLine : 127
    [STATUS] Write Pixel at : 0, 127
    [STATUS] Write Pixel at : 1, 127
    ...
    [STATUS] Write Pixel at : 252, 0
    [STATUS] Write Pixel at : 253, 0
    [STATUS] Write Pixel at : 254, 0
    [STATUS] Write Pixel at : 255, 0

    Là on voit bien que mes pixels sont transferés jusqu'au dernier.

    Avec un autre fichier de 291x400 paf

    Nom : 2017-05-15_152008.jpg
Affichages : 35
Taille : 12,0 Ko
    et
    Nom : 2017-05-15_152026.jpg
Affichages : 36
Taille : 43,7 Ko

    le petit log
    [STATUS] Taille de l'en-tête : 40
    [STATUS] Dimension : 291, 400
    [STATUS] LineSize : 873
    [STATUS] GetScanLine : 399
    [STATUS] Write Pixel at : 0, 399
    [STATUS] Write Pixel at : 1, 399
    [STATUS] Write Pixel at : 2, 399
    ...
    [STATUS] Write Pixel at : 287, 0
    [STATUS] Write Pixel at : 288, 0
    [STATUS] Write Pixel at : 289, 0
    [STATUS] Write Pixel at : 290, 0

    idem ici les pixels sont bien transférés.

    C'est un truc de dingue. Les erreurs sont vraiment différentes suivant les fichiers, Ca serai la même, encore je pourrais trouvé mon erreur mais là je n'arrive pas à voir pourquoi et ou ?

    Donc si vous avez des idées sur ce qui pourrait causer ces comportements totalement farfelus je serai aux anges.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  7. #7
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 431
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 431
    Points : 7 433
    Points
    7 433

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Avec un autre fichier de 291x400 paf
    Essaye comme j'ai fait, avec des fichiers de 4x1 ou 4x2, en plus si tu fais générer un fichier .bmp tu pourras aller voir dedans avec un éditeur hexa comment sont écrits les bytes.

    Mais pour voir avec tes yeux les fichiers, il faut une loupe (celle d'un colorpicker suffit).

    Cadeau : 4 fichiers, 2 en 24 bits et 2 en 32 (notés avec un A dans le nom), dan les deux cas 1 avec 1 ligne et l'autre avec 2 : 4_fic.zip


    Quant à ce que j'ai cité, fais gaffe avec les valeurs impaires : j'ai beaucoup vu d'exemples où il était noté que les valeurs devaient être paires.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 431
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 431
    Points : 7 433
    Points
    7 433

    Par défaut complément hallucinant

    Tiens, je squatte ton sujet, ça pourra t'intéresser, et les lecteurs aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      bm1 := TBitmap.Create;
      ShowMessage(StringReplace(bm1.RawImage.Description.AsString, ' ', LineEnding, [rfReplaceAll]));
      // BitsPerPixel=32
      bm1.LoadFromFile(opd.FileName);
      ShowMessage(StringReplace(bm1.RawImage.Description.AsString, ' ', LineEnding, [rfReplaceAll]));
      // BitsPerPixel=24 -- mis à 24 par loadFromFile, même en lui donnant un fichier 32 bits !?*$£§@&...
    Et à côté de ça, on a vu il y a quelques jours des bouts de code dans Graphics.pas ou similaire où dans un case of il n'y avait pas d'entrée 24bits...

    On se demande comment tout cela tient ! Le scotch et les bouts de ficelles doivent être costauds,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 388
    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 : 2 388
    Points : 3 735
    Points
    3 735

    Par défaut

    salut

    comme le dit Jipété
    pour ton troisième exemple tu as oublié le padding il faut que la longueur soit un multiple de 4
    dans ton cas
    291 * 3 = 873 =>873 DIV 4 = 218=>218*4=872=> 872+4 =>876
    donc nous aurons un padding de 3 en fin de ligne
    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

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 331
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 331
    Points : 8 732
    Points
    8 732

    Par défaut

    Ce n'est pas vraiment surprenant qu'il y ait violation d'accès et c'est un pur coup de chance si ça ne plante pas avec des images plus petites.

    ReallocMem(LineBuffer,LineSize) (équivalent à GetMem si pointeur nil) alloue une zone mémoire. Là, ok !
    Tu incrémentes ensuite ce pointeur par Inc(LineBuffer). Ok, pourquoi pas.
    Mais tu penses ensuite que ReAllocMem/FreeMem "se souviennent" du LineBuffer d'origine (avant incrémentation).

    Comment veux-tu que ça marche ?

    Il faut garder le pointeur d'origine et travailler sur une copie.

    Citation Envoyé par BeanzMaster Voir le message
    Non reallocmem ne détruit pas le pointeur Freemem oui.
    Et ça veut dire quoi détruire un pointeur ?
    ReallocMem(0) va libéré l'ensemble de la mémoire allouée à l'instar de FreeMem. Le pointeur est donc invalide dans les deux cas

  11. #11
    Membre averti

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 189
    Points : 407
    Points
    407

    Par défaut

    Citation Envoyé par Andnotor Voir le message
    Ce n'est pas vraiment surprenant qu'il y ait violation d'accès et c'est un pur coup de chance si ça ne plante pas avec des images plus petites.

    ReallocMem(LineBuffer,LineSize) (équivalent à GetMem si pointeur nil) alloue une zone mémoire. Là, ok !
    Tu incrémentes ensuite ce pointeur par Inc(LineBuffer). Ok, pourquoi pas.
    Mais tu penses ensuite que ReAllocMem/FreeMem "se souviennent" du LineBuffer d'origine (avant incrémentation).

    Comment veux-tu que ça marche ?

    Il faut garder le pointeur d'origine et travailler sur une copie.
    Merci AndNotOr,

    Je vais testé en utilisant une reference comme position comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SrcColor := PGLZColor_24(LineBuffer+X)^
    Et maintenant tu le dis j'ai eu un problème similaire dans une autre classe ou justement j'incrémentais mon pointer que j'avais solutionné comme ci-dessus


    Citation Envoyé par Andnotor Voir le message
    Et ça veut dire quoi détruire un pointeur ?
    ReallocMem(0) va libéré l'ensemble de la mémoire allouée à l'instar de FreeMem. Le pointeur est donc invalide dans les deux cas
    Oui détruire n'est pas le bon mot ce que je veux dire avec ReallocMem(0) la variable du pointeur n'est pas à nil, avec freemem oui, et par prudence sous lazarus faut mieux le forcer a nil après le freemem d'après mon expérience.


    Citation Envoyé par Jipété Voir le message
    Essaye comme j'ai fait, avec des fichiers de 4x1 ou 4x2, en plus si tu fais générer un fichier .bmp tu pourras aller voir dedans avec un éditeur hexa comment sont écrits les bytes.

    Mais pour voir avec tes yeux les fichiers, il faut une loupe (celle d'un colorpicker suffit).

    Cadeau : 4 fichiers, 2 en 24 bits et 2 en 32 (notés avec un A dans le nom), dan les deux cas 1 avec 1 ligne et l'autre avec 2 :


    Quant à ce que j'ai cité, fais gaffe avec les valeurs impaires : j'ai beaucoup vu d'exemples où il était noté que les valeurs devaient être paires.
    Merci Jipete je vais tester

    Citation Envoyé par anapurna Voir le message
    salut

    comme le dit Jipété
    pour ton troisième exemple tu as oublié le padding il faut que la longueur soit un multiple de 4
    dans ton cas
    291 * 3 = 873 =>873 DIV 4 = 218=>218*4=872=> 872+4 =>876
    donc nous aurons un padding de 3 en fin de ligne
    ça peux porter à confusion mais le padding est bien pris en charge. Ce n'est pas la même variable dans le log :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
     if X>MaxWidth then
        begin
          // On saute le padding de fin de ligne, si il existe
          if FLineEndGapSize>0 then Memory.Skip(FLineEndGapSize);
    ...
    Merci à tous je vais regarder tout ça et je vous tiens au jus.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  12. #12
    Membre averti

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 189
    Points : 407
    Points
    407

    Par défaut

    Merci AndNotOr

    Citation Envoyé par Andnotor Voir le message
    Ce n'est pas vraiment surprenant qu'il y ait violation d'accès et c'est un pur coup de chance si ça ne plante pas avec des images plus petites.

    ReallocMem(LineBuffer,LineSize) (équivalent à GetMem si pointeur nil) alloue une zone mémoire. Là, ok !
    Tu incrémentes ensuite ce pointeur par Inc(LineBuffer). Ok, pourquoi pas.
    Mais tu penses ensuite que ReAllocMem/FreeMem "se souviennent" du LineBuffer d'origine (avant incrémentation).

    Comment veux-tu que ça marche ?

    Il faut garder le pointeur d'origine et travailler sur une copie.
    Ca mériterais d'être dans la FAQ

    C'est bon à savoir

    Je lis et j'affiche tous mes fichiers + les tiens Jipete

    Merci beaucoup.

    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

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

Discussions similaires

  1. [WD15] Erreur lors du chargement du fichier d'audit
    Par fucce dans le forum WinDev
    Réponses: 2
    Dernier message: 25/01/2010, 08h31
  2. Réponses: 0
    Dernier message: 24/08/2008, 10h56
  3. Probleme lors d'impression de fichier pdf
    Par pierrot10 dans le forum Windows XP
    Réponses: 4
    Dernier message: 28/03/2007, 19h49
  4. Probleme lors du chargement du driver
    Par Zanton dans le forum JDBC
    Réponses: 2
    Dernier message: 12/10/2006, 14h02
  5. [swing] Probleme lors du chargement d'une grille
    Par issou dans le forum AWT/SWING
    Réponses: 6
    Dernier message: 29/03/2006, 14h38

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