Maintenant qu'on y voit un peu plus clair, replongeons vite dans le brouillard des pointeurs et des codes qui font un peu ce qu'ils veulent et pas ce que j'ai écrit...
1-les infos :
2-la copie
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //avec un fichier (gimpA_MSopaque3x1.bmp) de 1 seule ligne : (bih) Width : 3 (bih) Height : 1 (bih) Size Image : 12 (brid) Depth : 24 (bih) biBitCount : 32 // Bits-per-Pixel LineSize : 12 bmp2.PixelFormat : 4
3-le fichier résultat
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 // pas de balayage vertical pour alléger et essayer de comprendre, le bitmap dans le fichier n'a qu'une ligne bs := TBytesStream.Create; bs.SetSize(bih.biSizeImage); ptr1 := bmp1.RawImage.Data; for w := 0 to LineSize-1 do begin bs.WriteByte(byte(ptr1^)); ptr1 := Pointer( integer(ptr1)+1); end; bs.SaveToFile('/chemin/fichier.bin');
Données présentes dans la cible : 3 RGBTriple. Pourquoi ?
Le fichier source contient 80 00 FF FF | 80 00 FF FF | 80 00 FF FF (séparations " " et "|" ici de mon fait, si je mets 8000FFFF8000FFFF8000FFFF c'est passablement illisible -- mais plus juste).
Je rajoute, en début de boucle, memo1.Lines.Add('prt1 : '+ IntToHex(Integer(ptr1), 4)+' '+ IntToHex(Byte(ptr1^), 2)); et je récupère
qui ressemble bien au .bin, de haut en bas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 prt1 : B6E61290 80 prt1 : B6E61291 00 prt1 : B6E61292 FF prt1 : B6E61293 80 prt1 : B6E61294 00 prt1 : B6E61295 FF prt1 : B6E61296 80 prt1 : B6E61297 00 prt1 : B6E61298 FF prt1 : B6E61299 6F prt1 : B6E6129A 6E prt1 : B6E6129B 00
Mais avec memo1.Lines.Add('prt1 : '+ IntToHex(Integer(ptr1), 4)+' '+ IntToHex(Integer(ptr1^), 8)); c'est la cata :
On voit bien, en lisant de droite à gauche, que le dernier byte de chaque RGBQuad (le 2e FF), a sauté, transformant les RGBQuad en RGBTriple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 prt1 : B6E61290 80FF0080 prt1 : B6E61291 0080FF00 prt1 : B6E61292 FF0080FF prt1 : B6E61293 80FF0080 prt1 : B6E61294 0080FF00 prt1 : B6E61295 FF0080FF prt1 : B6E61296 6FFF0080 prt1 : B6E61297 6E6FFF00 prt1 : B6E61298 006E6FFF prt1 : B6E61299 11006E6F prt1 : B6E6129A C011006E prt1 : B6E6129B 29C01100
Pourquoi ?
Je "discute" au niveau pointeurs, là, les notions de RGBxxx n'ont pas de raison d'être, pas plus que PixelFormat et autres.
Je ne comprends pas.
Je n'aurais jamais imaginé que cela puisse être si compliqué de récupérer 3 integers (ou 12 bytes à la suite) dans une zone à plat dans un fichier...
Ou alors... Ou alors il y aurait un contrôle dans le code de RawImage.Data qui y adapterait les données qu'on y envoie en fonction des paramètres de haut niveau dont je pensais m'affranchir ?
Ça se tient.
Capillo-tracté mais ça se tient.
En tout cas, ça explique ce que je vois.
Hypothèse idiote, ce que je vois c'est ce que le code lit dans la source, et force est de constater que c'est mal lu.
Partager