Bonjour,

avant que je ne jette définitivement l'éponge, je viens voir si quelqu'un aurait une idée.

Le contexte : un vieux couple Lazarus/FreePascal (mais comme le graphisme n'a pas été mis à jour, ce n'est pas un problème) tournant dans une machine Debian 32 bits, et des fichiers bitmap à 32 bits par pixel.

Comme on le voit sur l'image ci-dessous, les fichiers sont bien ouverts avec The Gimp (ligne du haut) et l'outil en Lazarus (en bas) doit lui aussi les ouvrir, les afficher (à gauche), les dupliquer et afficher la copie (à droite).
Nom : rendus_gimp_laz.jpg
Affichages : 716
Taille : 44,6 Ko

On voit tout de suite que si pour l'un ça se passe bien, pour l'autre ce n'est pas du tout ça.
Le problème n° 1, c'est que je ne vois aucune différence dans les headers des fichiers ; bien sûr les tailles sont différentes, mais la chose qui aurait pu générer ce résultat catastrophique est la même pour les deux fichiers, je veux parler du "20" à l'adresse 1C, qui veut dire 32 bits.

Je confirme cette valeur avec un peu de calcul sur les dimensions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
//600x400x32 :    600x400 = 2400000
//                et l'adresse 22 23 24 25 (biSizeImage) contient 00 A6 0E 00 soit 000EA600 soit 960000 soit 240000x4 donc pf32
// 32bitkc :      250x250 = 62500
//                et l'adresse 22 23 24 25 (biSizeImage) contient 90 D0 03 00 soit 0003D090 soit 250000 soit 62500 x4 donc pf32
Alors, qu'est-ce que c'est qui met sa pagaille pour que je récupère cette collection de raies ? Voilà le début des headers, à partir de la ligne 30 c'est le début des datas, on s'en fiche.

Nom : compar_hexa_xbr-32kc.jpg
Affichages : 657
Taille : 96,3 Ko

Les plus observateurs remarqueront que le fichier du bas a des valeurs aux adresses 26-2D, ça concerne les informations de définition de l'image (improprement appelée "résolution", pas d'incidence normalement.

Le problème n° 2 c'est qu'avec plein d'autres fichiers en 32 bits, ça se passe comme ça :

Nom : 196x128x32.png
Affichages : 654
Taille : 3,4 Ko

et pour avoir une image correcte à droite, il me faut basculer le code de copie en mode 24 bits (), genre
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
// pbD et pbS sont des pointeurs de bytes pour se balader 
// en mode scanline dans la RawImage des TBitmap Source et Destination
idx := 0;
for w := 0 to (src.Width * 3)-1 do begin // byte par byte de g. à dte
  pbD^[idx] := pbS^[w];
  if ( (w+1) mod 3 = 0 ) then begin // w+1 pointe le 3e byte de la source
    // 1- inverser R et B dans la destination qu'on vient de traiter
    tempByte    := pbD^[idx-2];
    pbD^[idx-2] := pbD^[idx-0];
    pbD^[idx-0] := tempByte;
    // 2- ajouter le canal alpha puisqu'il le FAUT sous Linux SI la longueur est PAIRE
    // OU inférieure à 32, go figure !
    if src.Width < 32 then begin
      inc(idx);
      pbD^[idx] := 255;
    end else // longueur => 32, il faut tester si paire ou impaire
    if not Odd(src.Width) then begin 
      inc(idx);
      pbD^[idx] := 255;
    end;                      
  end;
  inc(idx);
end;
Une idée de comment solutionner ces pagailles et avoir un code maintenable (parce que là...) ?

Merci,

PS : j'ai testé avec TLazIntfImage, c'est un milliard de fois plus compliqué...