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 : Sélectionner tout - Visualiser dans une fenêtre à part
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é...
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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...