Stretchdraw auf Linux und Windows unterschiedlich und langsam ...[gelöst]

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Stretchdraw auf Linux und Windows unterschiedlich und langsam ...[gelöst]

Beitrag von corpsman »

Hallo Zusammen,

Ich bastle gerade an einem Tool zum Vermessen von Bildern. Dazu nutze ich eine TPaintbox in der ich alles Zeichne:

Code: Alles auswählen

Procedure TForm1.PaintBox1Paint(Sender: TObject);
Var
  i: Integer;
Begin
  If Not assigned(fImage) Then exit;
  // Das Eigentliche Bild
  PaintBox1.Canvas.StretchDraw(rect(-ScrollBar1.Position, -ScrollBar2.Position, br.X - ScrollBar1.Position, br.Y - ScrollBar2.Position), fImage); // <-- Um diese Zeile geht es 

  // Die Zusatzsachen
  fMetrik.Render();
  If CheckBox1.Checked Then Begin
    RenderLegend();
  End;
  For i := 0 To high(fMeasureElements) Do Begin
    fMeasureElements[i].Render();
  End;
  fPerspectiveCorrection.Render;
  fHeightCorrection.Render;
  fRotateCorrection.Render;
  // Die Vorschau immer als Letztes
  fPreview.Render(PaintBox1.Canvas);
End;          
Mein Problem ist nun folgendes:
unter Windows nutzt Stretchdraw eine Nearest Neighbour Interpolation ist ist recht fix
Unter Linux nutzt es eine Bilineare Interpolation und ist ätzend Langsam.

Kennt hier jemand einen Weg wie ich auch unter Linux die Nearest Neighbour interpolation bekomme, oder das generell etwas beschleunigen kann, normalerweise mache ich so was alles in OpenGL und da gibt es solche Probleme einfach nicht :oops:
Zuletzt geändert von corpsman am Sa 30. Jan 2021, 09:24, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Stretchdraw auf Linux und Windows unterschiedlich und langsam ...

Beitrag von corpsman »

Ok wer googeln kann ist klar im Vorteil

https://wiki.freepascal.org/Developing_ ... _LazCanvas

sagt dass es so geht:

Code: Alles auswählen


Procedure StretchDrawBitmapToBitmap(SourceBitmap, DestBitmap: TBitmap; DestWidth, DestHeight: integer);
Var
  DestIntfImage, SourceIntfImage: TLazIntfImage;
  DestCanvas: TLazCanvas;
Begin
  // Prepare the destination

  DestIntfImage := TLazIntfImage.Create(0, 0);
  DestIntfImage.LoadFromBitmap(DestBitmap.Handle, 0);

  DestCanvas := TLazCanvas.Create(DestIntfImage);

  //Prepare the source
  SourceIntfImage := TLazIntfImage.Create(0, 0);
  SourceIntfImage.LoadFromBitmap(SourceBitmap.Handle, 0);

  // Execute the stretch draw via TFPSharpInterpolation
  DestCanvas.Interpolation := TFPSharpInterpolation.Create;
  DestCanvas.StretchDraw(0, 0, DestWidth, DestHeight, SourceIntfImage);

  // Reload the image into the TBitmap
  DestBitmap.LoadFromIntfImage(DestIntfImage);

  SourceIntfImage.Free;
  DestCanvas.Interpolation.Free;
  DestCanvas.Free;
  DestIntfImage.Free;
End;

Procedure TForm1.PaintBox1Paint(Sender: TObject);
Var
  i: Integer;
{$IFDEF Linux}
  bmp: TBitmap;
{$ENDIF}
Begin
  If Not assigned(fImage) Then exit;
  // Das Eigentliche Bild
{$IFDEF Windows}
  PaintBox1.Canvas.StretchDraw(rect(-ScrollBar1.Position, -ScrollBar2.Position, br.X - ScrollBar1.Position, br.Y - ScrollBar2.Position), fImage);
{$ELSE}
  bmp := TBitmap.Create;
  bmp.Width := br.X;
  bmp.Height := br.Y;
  StretchDrawBitmapToBitmap(fImage, bmp, br.x, br.y);
  PaintBox1.Canvas.draw(-ScrollBar1.Position, -ScrollBar2.Position, bmp);
  bmp.free;
{$ENDIF}
  // Die Zusatzsachen
  fMetrik.Render();
  If CheckBox1.Checked Then Begin
    RenderLegend();
  End;
  For i := 0 To high(fMeasureElements) Do Begin
    fMeasureElements[i].Render();
  End;
  fPerspectiveCorrection.Render;
  fHeightCorrection.Render;
  fRotateCorrection.Render;
  // Die Vorschau immer als Letztes
  fPreview.Render(PaintBox1.Canvas);
End; 
Und das stimmt, aber es ist zum Erbrechen Langsam :(
--
Just try it

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Stretchdraw auf Linux und Windows unterschiedlich und langsam ...[gelöst]

Beitrag von Winni »

Hi!

Ich empfehle BGRAbitmap.
Geht deutlich schneller, stretch fällt aus der Tüte und ist sehr stabil.
Und plattformübergreifend.

Wenn das nicht langt:
Assembler lernen.

Winni

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Stretchdraw auf Linux und Windows unterschiedlich und langsam ...[gelöst]

Beitrag von corpsman »

*g*, thx.

Habs nun ohne Assembler deutlich beschleunigen können, durch clevere Vorberechnung. Danke
--
Just try it

Antworten