Impossible de travailler correctement en 32 bits avec TBitmap
Bonjour,
car pour une raison que j'ignore encore, au début d'une recopie de pixels par ScanLine (plus exactement par bmp.RawImage.GetLineStart), si le PixelFormat (pas celui de RawImage, celui du BitmapInfoHeader) est à pf32 juste avant le bmp.BeginUpdate, il est à pf24 après le EndUpdate, avec tous les effets indésirables qu'on peut supposer (SIGSEGV...)
Et impossible de l'examiner entre ces deux bornes, je me fais insulter et ça avorte.
Voilà la vie (p4src et p4dst sont des pRGBQuad, jpb c'est mon BitmapInfoHeader) :
Code:
1 2 3 4 5 6 7 8 9
| jpb := GetHeaderDatas(bmpDst); memo.Lines.Add(inttostr(jpb.PixelFormat)); // 32 dans le mémo
bmpDst.BeginUpdate;
for h := 0 to bmpSrc.Height-1 do begin
p4dst := pRGBQuad(bmpDst.RawImage.GetLineStart(h));
p4src := pRGBQuad(bmpSrc.RawImage.GetLineStart(h));
for w := 0 to bmpSrc.Width-1 do p4dst[w] := tagRGBQuad(AppliquerCorrections32(p4src[w]));
end;
bmpDst.EndUpdate;
jpb := GetHeaderDatas(bmpDst); memo.Lines.Add(inttostr(jpb.PixelFormat)); // 24 dans le mémo |
et je suis vraiment dégouté... :cry:
Car des fois la proc arrive à recopier tous les pixels d'une image et des fois ça part en SIGSEGV sans que je comprenne pourquoi.
Je n'ai pas réussi à trouver ce qui se cachait sous EndUpdate, je n'arrive pas à "remonter" plus haut que
Code:
1 2 3 4 5
| procedure TGraphic.Changed(Sender: TObject);
begin
FModified := True;
if Assigned(FOnChange) then FOnChange(Self);
end; |
dans graphic.inc.
PS : la fonction AppliquerCorrections32 trafique juste les valeurs des pixels et a été testée en 24 bits où elle fonctionne très très très bien (normich, là, tout le monde est en pf24 du début à la fin et avec du tagRGBTriple) :
Code:
1 2 3 4 5 6 7 8 9 10
| function AppliquerCorrections32(p4: tagRGBQuad): tagRGBQuad; inline;
var
i,j,k: integer;
begin
// Result := tagRGBQuad(RGBAtoRGBAQuad(255,0,0,255)); exit; // pour test -- SIGSEGV
i := integer(p4.rgbRed) + rp - rm; if i > 255 then i := 255; if i < 0 then i := 0;
// j et k c'est pareil avec rgbGreen et rgbBlue, enlevés ici pour alléger la lecture
// Result := tagRGBQuad(RGBAtoRGBAQuad(byte(i),byte(j),byte(k),255)); // la vraie vie -- SIGSEGV
Result := tagRGBQuad(p4); // pour test -- OK, image bien dupliquée à l'identique
end; |
Si quelqu'un avait une idée...