Handling mit übergroße Grafiken...

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
AllenVanDale
Beiträge: 25
Registriert: Di 14. Okt 2008, 11:41
Wohnort: 6xxxx Frankfurt
Kontaktdaten:

Handling mit übergroße Grafiken...

Beitrag von AllenVanDale »

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!
38911 BASIC BYTES FREE

monta
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...

Beitrag von monta »

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('...');
Johannes

AllenVanDale
Beiträge: 25
Registriert: Di 14. Okt 2008, 11:41
Wohnort: 6xxxx Frankfurt
Kontaktdaten:

Re: Handling mit übergroße Grafiken...

Beitrag von AllenVanDale »

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*
38911 BASIC BYTES FREE

monta
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...

Beitrag von monta »

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

pluto
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...

Beitrag von pluto »

AutoScroll auf True ? Image nicht AutoSize ?
MFG
Michael Springwald

AllenVanDale
Beiträge: 25
Registriert: Di 14. Okt 2008, 11:41
Wohnort: 6xxxx Frankfurt
Kontaktdaten:

Re: Handling mit übergroße Grafiken...

Beitrag von AllenVanDale »

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:

Code: Alles auswählen

Image1.Picture.LoadFromFile('c:\Testbild.bmp');
Image1.Width:=Image1.Picture.Width;
Image1.Height:=Image1.Picture.Height;
Danach erschienen dann die Scrollbalken ... und scrollten die linke obere Ecke des Bildes nach rechts bzw. unten.
Also genau falsch rum. :evil: Weiß der Geier wie man das wieder einstellt...

Ich hab dann meine eigenen Balken programmiert - ging irgendwie schneller. :D
38911 BASIC BYTES FREE

pluto
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...

Beitrag von pluto »

Code: Alles auswählen

Image1.Picture.LoadFromFile('c:\Testbild.bmp');
Image1.Width:=Image1.Picture.Width;
Image1.Height:=Image1.Picture.Height;
Das kann gar nicht, weil Image1.widht autmatisch gesetzt wird beim Laden.
Zeigt uns mal den ganzen Code. Da muss ein andere Fehler vorliegen.
MFG
Michael Springwald

AllenVanDale
Beiträge: 25
Registriert: Di 14. Okt 2008, 11:41
Wohnort: 6xxxx Frankfurt
Kontaktdaten:

Re: Handling mit übergroße Grafiken...

Beitrag von AllenVanDale »

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...
38911 BASIC BYTES FREE

pluto
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...

Beitrag von pluto »

Wie kann ich die Grafik nach links scrollen lassen, wenn sich der Scrollbalken nach rechts bewegt... usw...
Das sollte die Scrollbox von sich aus machen. Wenn du sie nutzt.
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

AllenVanDale
Beiträge: 25
Registriert: Di 14. Okt 2008, 11:41
Wohnort: 6xxxx Frankfurt
Kontaktdaten:

Re: Handling mit übergroße Grafiken...

Beitrag von AllenVanDale »

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:

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.
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? :roll:
38911 BASIC BYTES FREE

pluto
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...

Beitrag von pluto »

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 ?
MFG
Michael Springwald

AllenVanDale
Beiträge: 25
Registriert: Di 14. Okt 2008, 11:41
Wohnort: 6xxxx Frankfurt
Kontaktdaten:

Re: Handling mit übergroße Grafiken...

Beitrag von AllenVanDale »

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...
38911 BASIC BYTES FREE

pluto
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...

Beitrag von pluto »

Habe Image durch PaintBox ersetzt. Wenn ich nun scrolle verschwindet das Bild sofort (ScrollBox wird wieder grau).
Dieses verhalten ist klar, dass Bild wird nicht gebuffert, genau das tut TImage. Mach doch mal folgendes:
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

freeSmokey
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...

Beitrag von freeSmokey »

Ich würde sagen vielleicht solltest du nicht direkt das Canvas der Form nehmen, sondern eher ein TImage bzw. eine TPaintBox. :idea: müsste eigentlich funzen hatte das gleiche problem hatte die paint box benutzt und es funktioniert jetzt

AllenVanDale
Beiträge: 25
Registriert: Di 14. Okt 2008, 11:41
Wohnort: 6xxxx Frankfurt
Kontaktdaten:

Re: Handling mit übergroße Grafiken...

Beitrag von AllenVanDale »

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*
38911 BASIC BYTES FREE

Antworten