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 17. Mär 2015
Antwort Antwort
Perlsau
(Gast)

n/a Beiträge
 
#1

AW: TBitmap Grössenänderung langsam

  Alt 15. Mär 2015, 23:44
Ich würde den Mauszeiger in Form des Fadenkreuzes nicht über ein zweites TImage darstellen, sondern direkt ins erste TImage malen. Dazu zeichnest du die gewünschten Linien im Modus XOR, wobei das Fadenkreuz dort, wo bereits etwas gezeichnet wurde, invertiert dargestellt wird. Zum Löschen des alten Fadenkreuzes vor dem Zeichnen des neuen, was ja nach jeder Positionsänderung der Maus nötig ist, zeichnest du das alte Fadenkreuz noch einmal mit XOR und danach das neue ebenfalls wieder mit XOR. Das geht wesentlich schneller als die Darstellung über ein zweites TImage.
  Mit Zitat antworten Zitat
toenne

Registriert seit: 13. Jan 2011
14 Beiträge
 
#2

AW: TBitmap Grössenänderung langsam

  Alt 15. Mär 2015, 23:50
Kann ich mal ausprobieren, danke .

Dennoch würde mich die Lösung für mein ursprüngliches Problem interessieren. Im Speicher ein Bitmap von meinetwegen 30000x800px anlegen sollte doch eigentlich ruckzuck gehen? Das kopieren dieses Bitmaps aufs Canvas von Image2 geht ja auch schlagartig.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 01:53
Kann ich mal ausprobieren, danke .
Dennoch würde mich die Lösung für mein ursprüngliches Problem interessieren. Im Speicher ein Bitmap von meinetwegen 30000x800px anlegen sollte doch eigentlich ruckzuck gehen? Das kopieren dieses Bitmaps aufs Canvas von Image2 geht ja auch schlagartig.
Die Indianergeschichte mit dem toten Pferd kennst du, oder?

Wenn du den Aufwand, den du jetzt treibst, zu den Schwierigkeiten, die dein derzeitiges Konzept bereitet, dazuzählst, scheint mir der Aufwand mit dem einfachen Zeichnen des Fadenkreuzes im Vergleich dazu minimal. Übrigens machen Zeichenprogramme das auch nicht anders, wenn z.B. interaktiv eine Ellipse gezeichnet werden soll, wobei Größe und Breite der Ellipse den Bewegungen des Mauszeigers folgen. Vergleiche doch einmal, wieviele Pixel rumgeschaufelt werden müssen, um ein Fadenkreuz zu zeichnen, mit der Anzahl der Pixel, die bewegt werden müssen, um das komplette Bitmap zu kopieren. Offensichtlich ist Letzteres zu langsam, um einen flüssigen Ablauf zu gewährleisten.

Sollte das Motiv deiner Ablehnung meines Vorschlags darin liegen, daß du nicht weißt, wie man das Fadenkreuz dynamisch den Größenverhältnissen des Bitmaps anpaßt, helfe ich dir dabei gerne weiter.
  Mit Zitat antworten Zitat
toenne

Registriert seit: 13. Jan 2011
14 Beiträge
 
#4

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 20: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.546 Beiträge
 
Delphi 12 Athens
 
#5

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 21: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 21:51 Uhr)
  Mit Zitat antworten Zitat
toenne

Registriert seit: 13. Jan 2011
14 Beiträge
 
#6

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 22: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
 
#7

AW: TBitmap Grössenänderung langsam

  Alt 17. Mär 2015, 00: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
 
#8

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 21: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
 
#9

AW: TBitmap Grössenänderung langsam

  Alt 16. Mär 2015, 22: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 05:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz