AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi TBitmap Grössenänderung langsam
Thema durchsuchen
Ansicht
Themen-Optionen

TBitmap Grössenänderung langsam

Offene Frage von "Bjoerk"
Ein Thema von toenne · begonnen am 15. Mär 2015 · letzter Beitrag vom 16. Mär 2015
Antwort Antwort
toenne

Registriert seit: 13. Jan 2011
13 Beiträge
 
#1

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 19:22
Wieso Ablehnung? Ich habe doch gesagt ich probiere es aus. Und habe es auch gemacht: Funzt 1A, erwartungsgemäss.
Man muss halt nur daran denken in der OnChange-Routine der Scrollbar das alte Kreuz zu löschen und im nächsten OnMouseMove das Kreuz eben dann nicht zu löschen, dann ist alles gut. Nur übersichtlicher wird der Code dadurch natürlich auch nicht unbedingt...

Ich bin halt nach wie vor verblüfft wie lange die Grössenänderung des TBitmap dauert derweil das image2.Picture.Bitmap.assign(Bmp) ratzfatz geht. Vermutlich wird in letzterem Fall gar keine Datenmenge bewegt sondern lediglich ein Vektor auf den Speicherbereich des TBitmaps umgeleitet?
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 20:23
Also ich kann hier die Zeitdauer von 1 Sekunde nicht nachvollziehen.
Habe Deinen Code hier mal getestet, die beiden Zuweisungen für das Bitmap (Breite und Höhe) zusammen benötigen 0,72 ms, das ist weit entfernt von 1 Sekunde.

Man kann das aber noch etwas beschleunigen, mit

bmp.SetSize (Image1.width, Image1.height);

dauert es nur 0,58 ms.

Auf einem 7 Jahre alten PC getestet.

Geändert von Harry Stahl (16. Mär 2015 um 20:51 Uhr)
  Mit Zitat antworten Zitat
toenne

Registriert seit: 13. Jan 2011
13 Beiträge
 
#3

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 21:49
Also ich kann hier die Zeitdauer von 1 Sekunde nicht nachvollziehen.
Habe Deinen Code hier mal getestet, die beiden Zuweisungen für das Bitmap (Breite und Höhe) zusammen benötigen 0,72 ms, das ist weit entfernt von 1 Sekunde.
Ich habe es nicht mit 'ner Stoppuhr oder sonstwie gemessen, um beim Warten aber das klassische "Einundzwanzig..." auszusprechen hat es fast gereicht...also etwa Faktor 10 gegenüber deiner Messung.

Zitat:
Kann da auch keine Verzögerung feststellen?
Nun ja, immerhin hast du auch eine Zehnerpotenz vergessen: Deine Paintbox hat 3000px Breite, mein Image aber 30000px...

Immerhin käme Harrys Wert meiner Erwartung ziemlich nahe, merkwürdig dass es bei mir so lange dauert? An mangelnder Rechenpower sollte es eher nicht liegen, hier werkelt ein i7-3770S @3.1GHz mit 8GB RAM. Wobei: Ich nutze für die Entwicklung und die Tests Win7 64Bit, habe aber als Zielplattform Win 32Bit ausgewählt (mein Laptop läuft noch mit 32Bit XP). Sollte aber doch nix ausmachen?
Wo zum Geier steckt da bei mir die Bremse?
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 23:27
Bei deiner Variante muß bei jedem MouseMove eine Bitmap erstellt werden die 30.000 x 30.000 ist. Dann zeichnest du drauf doch sage und schreibe 2 Linien. Dann wird das GESAMTE Bitmap auf das Image kopiert (mit Assign). Das das ziemlich suboptimal ist ist irgendwie klar? (Bei meiner Variante ist das übrigens anders).
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 20:29
Wieso Ablehnung? Ich habe doch gesagt ich probiere es aus. Und habe es auch gemacht: Funzt 1A, erwartungsgemäss.
Okay, das mit der Ablehnung war nicht so gemeint, wie du es vielleicht verstanden hattest. Ich hatte den nächsten Satz so interpretiert, daß du dennoch bei deiner alten Methode bleiben möchtest.

Man muss halt nur daran denken in der OnChange-Routine der Scrollbar das alte Kreuz zu löschen und im nächsten OnMouseMove das Kreuz eben dann nicht zu löschen, dann ist alles gut. Nur übersichtlicher wird der Code dadurch natürlich auch nicht unbedingt...
Auch mit deiner Methode muß man auf OnChange reagieren. Wenn du beim nächsten MouseMove das Kreuz nicht löschst, sondern ein zweites zeichnest, hast du danach zwei Kreuze in deinem Bitmap. Du mußt dir aber auf jeden Fall in MouseMove die Mausposition merken, um das letzte Kreuz korrekt löschen sprich mit XOR übermalen zu können.

Ich bin halt nach wie vor verblüfft wie lange die Grössenänderung des TBitmap dauert derweil das image2.Picture.Bitmap.assign(Bmp) ratzfatz geht. Vermutlich wird in letzterem Fall gar keine Datenmenge bewegt sondern lediglich ein Vektor auf den Speicherbereich des TBitmaps umgeleitet?
Assign weist in der Tat lediglich einen Pointer zu, da der Speicherbereich, auf den der Quell-Pointer verweist, ja bereits existiert.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 21:17
Kann da auch keine Verzögerung feststellen?

Beispiel:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    PaintBox1: TPaintBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1Paint(Sender: TObject);
    procedure PaintBox1MouseEnter(Sender: TObject);
    procedure PaintBox1MouseLeave(Sender: TObject);
  private
    FGraphic: TBitmap;
    FP: TPoint;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FGraphic := TBitmap.Create;
  PaintBox1.Left := 0;
  PaintBox1.Top := 0;
  PaintBox1.Align := alNone;
  PaintBox1.Width := 3000;
  PaintBox1.Height := 3000;
  FGraphic.Width := PaintBox1.Width;
  FGraphic.Height :=PaintBox1.Height;
  ScrollBox1.DoubleBuffered := true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FGraphic.Free;
end;

procedure TForm1.PaintBox1MouseEnter(Sender: TObject);
begin
  ShowCursor(false);
end;

procedure TForm1.PaintBox1MouseLeave(Sender: TObject);
begin
  ShowCursor(true);
end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  FP := Point(X, Y);
  PaintBox1.Invalidate;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  PaintBox1.Canvas.Draw(0, 0, FGraphic);
  PaintBox1.Canvas.MoveTo(FP.X, 0);
  PaintBox1.Canvas.LineTo(FP.X, PaintBox1.Height);
  PaintBox1.Canvas.MoveTo(0, FP.Y);
  PaintBox1.Canvas.LineTo (PaintBox1.Width, FP.Y);
end;

end.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz