Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild verschieben - Komponente belassen (https://www.delphipraxis.net/89106-bild-verschieben-komponente-belassen.html)

Flo.Hoe 26. Mär 2007 14:05


Bild verschieben - Komponente belassen
 
Wie ist es möglich, die Position einer Bitmap auf einem Image zu verändern, ohne aber die Komponente selbst zu verschieben?

turboPASCAL 26. Mär 2007 14:09

Re: Bild verschieben - Komponente belassen
 
Ja, natürlich ist das möglich.


Nur nicht so auf die Schnelle. ;)

Den Bildteil den du verschieben willst musst du in ein temp. Bitmap kopieren.
Dann kannst du diesen an einer Pos. deiner Wahl auf das Hauptbitmap kopieren.

Flo.Hoe 26. Mär 2007 14:48

Re: Bild verschieben - Komponente belassen
 
Das wäre dann wohl folgendes:

Delphi-Quellcode:
procedure TForm1.verschieben;
var BildTemp: TBitmap;
begin
i:=i+1;
BildTemp:=image1.Picture.Bitmap;

//image1.Picture.Bitmap wird gelöscht
//BildTemp wird auf Position (i,0) gesetzt
end;
Aber wie erlange ich Zugriff auf die Position?

HannosG 26. Mär 2007 15:04

Re: Bild verschieben - Komponente belassen
 
Einfach neu reinzeichnen:
Delphi-Quellcode:
Image1.CopyRect(Rect(x,y,x+BildTemp.Width,y+BildTemp.Heigth),BildTemp.Canvas,BildTemp.Canvas.ClipRect);
Gruß, Hanno

turboPASCAL 26. Mär 2007 15:15

Re: Bild verschieben - Komponente belassen
 
Zitat:

Zitat von Flo.Hoe
Das wäre dann wohl folgendes:

Code:
procedure TForm1.verschieben;
var BildTemp: TBitmap;
begin
i:=i+1;
[color=#ff0000][b]BildTemp:=image1.Picture.Bitmap;[/b][/color]

//image1.Picture.Bitmap wird gelöscht
//BildTemp wird auf Position (i,0) gesetzt
end;

Autsch, nein. Ein Bitmap muss vorher Erstellt werden. Bei der Imagekompo macht dir das die VCL.

Also so:

Delphi-Quellcode:
BildTemp := TBitmap.Create; // ein neues leeres Bitmap (Object) erzeugen
Delphi-Referenz durchsuchen TBitmap

Flo.Hoe 26. Mär 2007 15:45

Re: Bild verschieben - Komponente belassen
 
Zusammenfassend sieht das dann so aus:
Delphi-Quellcode:
procedure TForm1.verschieben;
var BildTemp: TBitmap;
begin
BildTemp:=Tbitmap.Create;
BildTemp:=image1.Picture.Bitmap;
//image1.Picture.Bitmap wird gelöscht
image1.Picture.Bitmap.Canvas.CopyRect(rect(100,100,Bildtemp.Width+100,BildTemp.Height+100),BildTemp.Canvas,BildTemp.Canvas.ClipRect);
end;
Beim Aufruf dieser Prozedur passiert rein gar nichts.
Aber eigentlich müsste es doch funktionieren oder?

HannosG 26. Mär 2007 15:50

Re: Bild verschieben - Komponente belassen
 
Du hast Width und Heigth vom Bitmap BildTemp noch nicht eingestellt.

Willst du das gesamte Image verschieben, oder nur ein Teil davon?

SirThornberry 26. Mär 2007 15:54

Re: Bild verschieben - Komponente belassen
 
ein ganz böser Fehler bzw. speicherleck
Delphi-Quellcode:
//ein TBitmap wird erstellt und BildTemp zeigt auf diesen Speicher
BildTemp:=Tbitmap.Create;
//BildTemp zeigt danach auf die Stelle Image1.Picture.Bitmap und nicht mehr auf die Stelle wo das neu erstellte Bitmap ist
BildTemp:=image1.Picture.Bitmap;
wenn dann so
Delphi-Quellcode:
BildTemp:=Tbitmap.Create;
BildTemp.Assign(image1.Picture.Bitmap);

HannosG 26. Mär 2007 16:23

Re: Bild verschieben - Komponente belassen
 
Wenn nur ein Teil verschoben werden soll:

Delphi-Quellcode:
procedure TForm1.Verschieben;
var BildTemp: TBitmap;
begin
BildTemp:=TBitmap.Create;
BildTemp.Width:=DieBitmapBreite;
BildTemp.Heigth:=DieBitmapHoehe;


//Bitmap wird aus Image1.Canvas aus der Position (i,0) in BildTemp hineinkopiert
BildTemp.CopyRect(Rect(0,0,BildTemp.Width,BildTemp.Heigth),Image1.Canvas,Rect(i,0,i+BildTemp.Width,BildTemp.Heigth));

//Image1.Canvas wird mit einem Rectangle übermalt
Image1.Canvas.Rectangle(-1,-1,Image1.Width+1,Image1.Heigth+1);

inc(i);

//BildTemp wird auf Position (i,0) gesetzt
Image1.CopyRect(Rect(i,0,i+BildTemp.Width,BildTemp.Heigth),BildTemp.Canvas,BildTemp.Canvas.ClipRect);
end;
ansonsten:


Delphi-Quellcode:
procedure TForm1.Verschieben;
var BildTemp: TBitmap;
begin
BildTemp:=TBitmap.Create;

//Image1 wird in Bitmap kopiert
BildTemp.Assign(Image1.Picture.Bitmap);

//Image1.Canvas wird mit einem Rectangle übermalt
Image1.Canvas.Rectangle(-1,-1,Image1.Width+1,Image1.Heigth+1);

inc(i);

//BildTemp wird auf Position (i,0) gesetzt
Image1.CopyRect(Rect(i,0,i+BildTemp.Width,BildTemp.Heigth),BildTemp.Canvas,BildTemp.Canvas.ClipRect);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf