Wie ein Rechteck aus TImage in einen Puffer peichern?

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Wie ein Rechteck aus TImage in einen Puffer peichern?

Beitrag von br_klaus »

Hallo,

Wie kann man einen bestimmten Bereich (TRect) auf einer TImage in einen Puffer speichern und dann wieder auf die TImage kopieren?
Ich bräuchte das, um ein Polygon innerhalb dieses Bereichs ohne Flimmern mit Maus über das Timage ziehen zu können. Oder gibt es da noch andere Methoden?
Und wie würde das konkret aussehen?
Herzlichen Dank!

Das Programm sähe in etwa so aus:

Code: Alles auswählen

r = gewünschtes TRect
p = Polygon
speichern(r,puffer) --> speichert r nach Puffer; setzt gespeichert: = true
holen(r,puffer)  ---> puffer wieder ausgeben auf TImage
 
procedure Tform1.Image1Mousemove(....x,y..)
  const altr:Trect = rect(0,0,0,0)// zur Sicherung des Bereichs
   begin
      r:= rect(...) // in Abhängigkeit von x,y
      if not gespeichert then speichern(r,puffer);
      holen(altr, puffer)// TImage wieder zurücksetzen
      speichern(r,puffer);
      canvas.polygon(p);
      altr:=r; // Bereich sichern
   end;

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie ein Rechteck aus TImage in einen Puffer peichern?

Beitrag von theo »

Ich würde da kein TImage nehmen, sondern beide Elemente (Bild und Polygon) flüchtig auf einen Canvas zeichnen.
Beim Moven der Maus, kannst du den fraglichen Bereich invalidieren (evtl. nur partiell mit InvalidateRect), und in OnPaint neu zeichnen.
Am Besten gehst du gleich von einem Control abgeleitet von TCustomControl aus.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Wie ein Rechteck aus TImage in einen Puffer peichern?

Beitrag von Scotty »

Als Ergänzung zu theo: TCanvas hat die Eigenschaft DoubleBuffered. Damit wird puffern überflüssig. Ansonsten suchst du nach der Funktion wie TCanvas.CopyRect() (unit Graphics) und BitBlt() oder MaskBlt() (unit LCLIntf).

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Wie ein Rechteck aus TImage in einen Puffer peichern?

Beitrag von br_klaus »

@theo
Aber ich habe doch schon ein TImage, auf das ich eine (aus dem Speicher bzw von Disk) geladene BildDatei anzeige. Soll ich dann nur Image.canvas nehmen? Oder welche Canvas?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie ein Rechteck aus TImage in einen Puffer peichern?

Beitrag von theo »

Hab ich doch eigentlich alles geschrieben. TCustomControl.Canvas. Das Bild pufferst du in einem TBitmap oder so.

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Wie ein Rechteck aus TImage in einen Puffer peichern?

Beitrag von br_klaus »

theo hat geschrieben:Das Bild pufferst du in einem TBitmap oder so.

Und wie macht man das? (Das war ja mein eigentliches Problem)

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie ein Rechteck aus TImage in einen Puffer peichern?

Beitrag von theo »

Der Einfachheit halber für die TForm z.B. so:

Code: Alles auswählen

...
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { private declarations }
    fBitmap:TBitmap;
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  fBitmap:=TBitmap.Create;
  fBitmap.LoadFromFile('/home/theo/test.bmp');
end;
 
procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Draw(0,0,fBitmap);
  Canvas.FillRect(2,2,24,24);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  fBitmap.free;
end
 
...

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Wie ein Rechteck aus TImage in einen Puffer peichern?

Beitrag von br_klaus »

@theo
Vielen Dank!
mit OnPaint canvas.draw(0,0,FBitmap) und anschließend canvas.polygon(p) hat es geklappt!
Damit konnte ich auch endlich mein Fadenkreuz realisieren.
Nur wie man da (bzw in jedem größeren Farbbereich) die Farbe zum Hintergrund kostrastierend macht (weiß bei dunkel, schwarz bei hell), das weiß ich nicht. (Habe schon entsprechendes neues Thema gestellt).

Antworten