Handling mit übergroße Grafiken...
-
- Beiträge: 25
- Registriert: Di 14. Okt 2008, 11:41
- Wohnort: 6xxxx Frankfurt
- Kontaktdaten:
Handling mit übergroße Grafiken...
Hallöchen!
Ich möchte gerne Grafiken erstellen, die größer sind als das Anwendungsfenster bzw. die Auflösung des Monitor.
Ich habe bereits ein Programm geschrieben, daß mir innerhalb eines rechteckigen Bereichs von TForm, mit den Canvas-Befehlen, Grafiken generiert und diese mit "TBitmap.Canvas.CopyRect..." und "TBitmap.SaveToFile..." als BMP-File speichert.
Leider ist mit die Auflösung beim Ausdrucken nicht fein genug.
Bräuchte also mehr Pixel (= größeres Canvas). Ich dachte so an min. 2000x3000 Pixel (für eine DIN A4 Seite mit 300DPI).
Suche einen Lösungsansatz - Welche Klasse? Was muß ich wann und wie definieren (Größe)? Scrollbalken wären nett - müssen aber
nicht sein.
Thanx, Chris!
Ich möchte gerne Grafiken erstellen, die größer sind als das Anwendungsfenster bzw. die Auflösung des Monitor.
Ich habe bereits ein Programm geschrieben, daß mir innerhalb eines rechteckigen Bereichs von TForm, mit den Canvas-Befehlen, Grafiken generiert und diese mit "TBitmap.Canvas.CopyRect..." und "TBitmap.SaveToFile..." als BMP-File speichert.
Leider ist mit die Auflösung beim Ausdrucken nicht fein genug.
Bräuchte also mehr Pixel (= größeres Canvas). Ich dachte so an min. 2000x3000 Pixel (für eine DIN A4 Seite mit 300DPI).
Suche einen Lösungsansatz - Welche Klasse? Was muß ich wann und wie definieren (Größe)? Scrollbalken wären nett - müssen aber
nicht sein.
Thanx, Chris!
38911 BASIC BYTES FREE
-
- Lazarusforum e. V.
- Beiträge: 2809
- Registriert: Sa 9. Sep 2006, 18:05
- OS, Lazarus, FPC: Linux (L trunk FPC trunk)
- CPU-Target: 64Bit
- Wohnort: Dresden
- Kontaktdaten:
Re: Handling mit übergroße Grafiken...
Nimm nicht direkt das Canvas der Form, sondern ein TImage bzw. TPaintBox.
Vorgehensweise:
TScrollbox auf das Formular packen und Align auf alClient.
In die Scrollbox ein TImage und einfach die width und height-Eigenschaften auf bspw. 3000 setzen.
Dann hast du dein großes Canvas über TImage1.Canvas... und deine Scrollbalken.
(Beide Komponenten unter Additional)
Speichern geht dann auch einfach mit Image1.Picture.Bitmap.SaveToFile('...');
Vorgehensweise:
TScrollbox auf das Formular packen und Align auf alClient.
In die Scrollbox ein TImage und einfach die width und height-Eigenschaften auf bspw. 3000 setzen.
Dann hast du dein großes Canvas über TImage1.Canvas... und deine Scrollbalken.
(Beide Komponenten unter Additional)
Speichern geht dann auch einfach mit Image1.Picture.Bitmap.SaveToFile('...');
Johannes
-
- Beiträge: 25
- Registriert: Di 14. Okt 2008, 11:41
- Wohnort: 6xxxx Frankfurt
- Kontaktdaten:
Re: Handling mit übergroße Grafiken...
Hi monta!
Hab mal etwas mit TScrollbox und TImage rumexperimentiert. Größe definieren, zeichnen und speichern klappt problemlos und superschnell. Nur die Scrollbalken weigern sich hartnäckig! Sind enabled und visible aber scheinbar trotzdem nicht vorhanden.
*grübel*
Hab mal etwas mit TScrollbox und TImage rumexperimentiert. Größe definieren, zeichnen und speichern klappt problemlos und superschnell. Nur die Scrollbalken weigern sich hartnäckig! Sind enabled und visible aber scheinbar trotzdem nicht vorhanden.
*grübel*
38911 BASIC BYTES FREE
-
- Lazarusforum e. V.
- Beiträge: 2809
- Registriert: Sa 9. Sep 2006, 18:05
- OS, Lazarus, FPC: Linux (L trunk FPC trunk)
- CPU-Target: 64Bit
- Wohnort: Dresden
- Kontaktdaten:
Re: Handling mit übergroße Grafiken...
Müsste eigentlich gehen, wichtig sind teilweise die Align-Eigenschaften. Das Image darf glaub ich kein align gesetzt haben, das verhindert die Scrollbalken wärend dessen die Scrollbox align alClient hat.
Johannes
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Handling mit übergroße Grafiken...
AutoScroll auf True ? Image nicht AutoSize ?
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 25
- Registriert: Di 14. Okt 2008, 11:41
- Wohnort: 6xxxx Frankfurt
- Kontaktdaten:
Re: Handling mit übergroße Grafiken...
Hab den Fehler wohl inzwischen gefunden. Nach dem laden mit Image1.Picture.LoadFromFile müssen
wohl die Werte für Höhe und Breite nochmal manuell ins Image kopiert werden. So etwa:
Danach erschienen dann die Scrollbalken ... und scrollten die linke obere Ecke des Bildes nach rechts bzw. unten.
Also genau falsch rum.
Weiß der Geier wie man das wieder einstellt...
Ich hab dann meine eigenen Balken programmiert - ging irgendwie schneller.
wohl die Werte für Höhe und Breite nochmal manuell ins Image kopiert werden. So etwa:
Code: Alles auswählen
Image1.Picture.LoadFromFile('c:\Testbild.bmp');
Image1.Width:=Image1.Picture.Width;
Image1.Height:=Image1.Picture.Height;
Also genau falsch rum.

Ich hab dann meine eigenen Balken programmiert - ging irgendwie schneller.

38911 BASIC BYTES FREE
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Handling mit übergroße Grafiken...
Code: Alles auswählen
Image1.Picture.LoadFromFile('c:\Testbild.bmp');
Image1.Width:=Image1.Picture.Width;
Image1.Height:=Image1.Picture.Height;
Zeigt uns mal den ganzen Code. Da muss ein andere Fehler vorliegen.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 25
- Registriert: Di 14. Okt 2008, 11:41
- Wohnort: 6xxxx Frankfurt
- Kontaktdaten:
Re: Handling mit übergroße Grafiken...
Leider hab ich den Code in der ursprünglichen Version nicht mehr, da ich ständig rumgebastelt habe.
Da sich aber alles nicht so "nach Vorschrift" verhallten hat, nehme ich an, daß sich da mehrere Fehler (z.B. Einstellungen im Objektmanager, Wertezuweisungen, usw.) gegenseitig beeinflust haben.
In einem anderen Projekt hab ich die Scrollbox nachträglich eigebaut und dort verhält sie sich wie allgemein beschreiben.
Das Problem mit der Scrollrichtung läßt mich aber nicht in Ruhe!!
Wie kann ich die Grafik nach links scrollen lassen, wenn sich der Scrollbalken nach rechts bewegt... usw...
Da sich aber alles nicht so "nach Vorschrift" verhallten hat, nehme ich an, daß sich da mehrere Fehler (z.B. Einstellungen im Objektmanager, Wertezuweisungen, usw.) gegenseitig beeinflust haben.
In einem anderen Projekt hab ich die Scrollbox nachträglich eigebaut und dort verhält sie sich wie allgemein beschreiben.
Das Problem mit der Scrollrichtung läßt mich aber nicht in Ruhe!!
Wie kann ich die Grafik nach links scrollen lassen, wenn sich der Scrollbalken nach rechts bewegt... usw...
38911 BASIC BYTES FREE
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Handling mit übergroße Grafiken...
Das sollte die Scrollbox von sich aus machen. Wenn du sie nutzt.Wie kann ich die Grafik nach links scrollen lassen, wenn sich der Scrollbalken nach rechts bewegt... usw...
Du kannst ja mal ein Beispiel Projekt anhängen, dann können wir es uns ansehen. Weil so tappen wir im dunkel.....
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 25
- Registriert: Di 14. Okt 2008, 11:41
- Wohnort: 6xxxx Frankfurt
- Kontaktdaten:
Re: Handling mit übergroße Grafiken...
Ok! Fangen wir ganz einfach an.
Man nehme: Ein neues Projekt ... darauf eine ScrollBox und in die ScrollBox ein Image ... für das Image setzt ich im Inspektor die Werte Width := 2000 und Height := 3000 ... außerdem Autoscroll auf True ... dazu noch, just for fun, ein Button ... Fertig!
Und das ist der Quellcode:
Nach dem Programmstart erhalte ich nach dem Klick auf den Button ein schwarzes Image mit roten Rechtecken!
Soweit alles supi! Scrolle ich dieses läuft das Bild in die falsche Richtung!
Was habe ich vergessen?
Man nehme: Ein neues Projekt ... darauf eine ScrollBox und in die ScrollBox ein Image ... für das Image setzt ich im Inspektor die Werte Width := 2000 und Height := 3000 ... außerdem Autoscroll auf True ... dazu noch, just for fun, ein Button ... Fertig!
Und das ist der Quellcode:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
ScrollBox1: TScrollBox;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
// Jetzt malen wir zufällig rote Rechtecke ins Image...
var l,x,y : word;
begin
For l := 1 to 1000 do
begin
x := Random(1900);
y := Random(2900);
Image1.Canvas.Brush.Color:=Random($F0)+$F; // Zufällige Rottöne
Image1.Canvas.Rectangle(x,y,x+Random(100),y+Random(100));
end;
end;
initialization
{$I unit1.lrs}
end.
Soweit alles supi! Scrolle ich dieses läuft das Bild in die falsche Richtung!
Was habe ich vergessen?

38911 BASIC BYTES FREE
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Handling mit übergroße Grafiken...
mach mal vor der schleife ein FillRect... und deine Zufalls werte könnten auch mal 0,0,0,0 ergeben. Aber das dürfte eigentlich kein Problem sein.
Was ist wenn du das Image gegen eine PaintBox austauscht ?
Was ist wenn du das Image gegen eine PaintBox austauscht ?
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 25
- Registriert: Di 14. Okt 2008, 11:41
- Wohnort: 6xxxx Frankfurt
- Kontaktdaten:
Re: Handling mit übergroße Grafiken...
Habe Image durch PaintBox ersetzt. Wenn ich nun scrolle verschwindet das Bild sofort (ScrollBox wird wieder grau).
Was in der Button1Click-Procedure passiert ist zum Testen schon OK so... FillRect oder ein Rect mit einer Ausdehnung
von 0 Pixeln verändern ja nicht wirklich was...
Was in der Button1Click-Procedure passiert ist zum Testen schon OK so... FillRect oder ein Rect mit einer Ausdehnung
von 0 Pixeln verändern ja nicht wirklich was...
38911 BASIC BYTES FREE
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Handling mit übergroße Grafiken...
Dieses verhalten ist klar, dass Bild wird nicht gebuffert, genau das tut TImage. Mach doch mal folgendes:Habe Image durch PaintBox ersetzt. Wenn ich nun scrolle verschwindet das Bild sofort (ScrollBox wird wieder grau).
Erstelle ein Temp TBitmap, mache sie so groß wie du sie haben möchtest, zeichne dort die Roten Vierecke rein. Dann gehst du in das onPaint von der Scrollbox und kopierst das rect aus der TBitmap mit bitblt den sichtbaren Ausschnitt. Denn bekommst du mit Scrollbox1.Canvas.clippingRect oder so ähnlich.
Ich hoffe du kannst mir folgen. Das ist zwar keine Optimale Lösung, müsste aber gehen.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 12
- Registriert: Mo 9. Mär 2009, 10:54
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Hambühren
Re: Handling mit übergroße Grafiken...
Ich würde sagen vielleicht solltest du nicht direkt das Canvas der Form nehmen, sondern eher ein TImage bzw. eine TPaintBox.
müsste eigentlich funzen hatte das gleiche problem hatte die paint box benutzt und es funktioniert jetzt

-
- Beiträge: 25
- Registriert: Di 14. Okt 2008, 11:41
- Wohnort: 6xxxx Frankfurt
- Kontaktdaten:
Re: Handling mit übergroße Grafiken...
Das Problem ist nicht die Grafik irgendwie(!) zu scrollen zu bringen, sondern das mir die Scrollbox suggeriert, ich muß lediglich ein Image draufpacken und gut ist! Im Prinzip funktioniert das ja auch - bis auf die Scrollrichtung!
Mir geht es hier eigentlich nur noch um sowas wie Programmieresthetik.
Es kann doch nicht sein, daß ein Standard-Problem(!!!) von der ScrollBox nur halb gelöst wurde. *kopfschüttel*
Mir geht es hier eigentlich nur noch um sowas wie Programmieresthetik.
Es kann doch nicht sein, daß ein Standard-Problem(!!!) von der ScrollBox nur halb gelöst wurde. *kopfschüttel*
38911 BASIC BYTES FREE