Je suis anéanti !
Anéanti car j'étais tout content d'avoir enfin trouvé une solution (lien dans le code + bas) qui fonctionne tip-top, j'ai ma ligne rouge, j'ai d'autres fichiers avec deux lignes de 8 pixels, les couleurs sont bonnes, en pf24bit comme en pf32bit, bref, je monte dans les tours en testant avec des fichiers de + en + gros et là, patatras, j'ai plusieurs images de 250x250 en 24 et 32 bits, et aucune copie ne fonctionne
J'ai beau forcer en remplaçant 3 par 4 partout où je le trouve, rien n'y fait : les copies affichent des traits verticaux symptomatiques des problèmes de balayage, et cette fois je n'arrive pas à trouver où ça coince, indépendamment du fait que parfois
bmp1.PixelFormat remonte
24 quand il est bien clair que l'image est en
32 bits.
Va comprendre...
C'est l'enfer qui revient, après seulement 15 minutes de bonheur.
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
| procedure TForm1.btnForumFPClick(Sender: TObject);
// http://forum.lazarus.freepascal.org/index.php?topic=7771.15 3e post en partant de la fin
var
bmp1, bmp2:TBitmap;
ptr1, ptr2:Pointer;
h,w:integer;
begin
if opd.Execute then
try
bmp1:=TBitmap.Create;
bmp2:=TBitmap.Create;
bmp1.LoadFromFile(opd.FileName);
caption := (IntToStr(BytesPerPixel(bmp1.PixelFormat)));
// 3 avec exp2a_250.bmp, "a" pour alpha, ie c'est un fichier 32 bits, alors pourquoi 3 ?
// mais 3 aussi (correct) avec test24bits.bmp dont la copie foire quand même...
bmp2.PixelFormat := bmp1.PixelFormat;
bmp2.SetSize(bmp1.Width, bmp1.Height);
Image1.Picture.Assign(bmp1);
bmp2.BeginUpdate;
for h:=0 to bmp1.Height-1 do begin
ptr1 := bmp1.RawImage.Data + bmp1.Width*3*h;
ptr2 := bmp2.RawImage.Data + bmp2.Width*4*h;
for w:=0 to bmp1.Width-1 do begin
Move(ptr1^, ptr2^, 3);
ptr1 := Pointer( integer(ptr1)+3); //BGRBGRBGR
ptr2 := Pointer( integer(ptr2)+4); //BGRXBGRXBGRX
end;
end;
bmp2.EndUpdate;
Image3.Picture.Assign(bmp2);
// bmp2.SaveToFile('../cc.bmp');
finally
bmp1.Free;
bmp2.Free;
end;
end; |
Partager