TImage Canvas Bilder zeichnen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
programmingpony
Beiträge: 18
Registriert: Do 26. Mär 2015, 14:45

TImage Canvas Bilder zeichnen

Beitrag von programmingpony »

Huhu,

Gibt es eine Möglichkeit auf ein TImage mit Canvas Bilder von zB einer Tilemap zu zeichnen?

MFG ProgrammingPony

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

Re: TImage Canvas Bilder zeichnen

Beitrag von theo »

Ja.

Code: Alles auswählen

procedure TForm1.Image1Paint(Sender: TObject);
begin       
Image1.Canvas.Draw(x,y,MyBmp);
....

reicht wahrscheinlich schon.

Das hier schon durchgestöbert? http://wiki.freepascal.org/Developing_with_Graphics/de

programmingpony
Beiträge: 18
Registriert: Do 26. Mär 2015, 14:45

Re: TImage Canvas Bilder zeichnen

Beitrag von programmingpony »

Mir wäre eine Lösung ohne andere Librarys lieb , ansonsten welcher ist der einfachste weg?

Edit

Könntest du mir auch noch zeigen wie ich die Bilder dann rein lade oder ob ich eine Stelle des geladenen Bildes auf eine Stelle aufs Canvas zeichnen kann
Zuletzt geändert von programmingpony am Do 26. Mär 2015, 15:13, insgesamt 1-mal geändert.

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

Re: TImage Canvas Bilder zeichnen

Beitrag von theo »

programmingpony hat geschrieben:Mir wäre eine Lösung ohne andere Librarys lieb , ansonsten welcher ist der einfachste weg?


Hatte oben noch editiert.
Der Link hat nicht primär mit anderen Libs zu tun.

programmingpony
Beiträge: 18
Registriert: Do 26. Mär 2015, 14:45

Re: TImage Canvas Bilder zeichnen

Beitrag von programmingpony »

Hab auch editiert :D

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

Re: TImage Canvas Bilder zeichnen

Beitrag von theo »

programmingpony hat geschrieben:Hab auch editiert :D

Lies doch mal den Link. Dort steht wie man Bitmaps erstellt und von Datei lädt.
X,Y bei obigem Beispiel ist die Zeichenposition.

programmingpony
Beiträge: 18
Registriert: Do 26. Mär 2015, 14:45

Re: TImage Canvas Bilder zeichnen

Beitrag von programmingpony »

An welcher Stelle soll es denn stehen?

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

Re: TImage Canvas Bilder zeichnen

Beitrag von theo »

http://wiki.freepascal.org/Developing_w ... nd_TBitmap

Code: Alles auswählen

var
  b: TBitmap;
begin
  b := TBitmap.Create;
  try
    b.LoadFromFile('test.bmp');
...

programmingpony
Beiträge: 18
Registriert: Do 26. Mär 2015, 14:45

Re: TImage Canvas Bilder zeichnen

Beitrag von programmingpony »

Könntest du mir einen kleinen sourcecode ggf kleines Projekt geben?

Ich suche schon seit heute morgen :/

Ich würde gerne in ein TImage ein Bild reinladen mit zB 10*10 Tiles mit je 32*32 px und auf dem anderen TImage an einigen Stellen einige der Tiles aus der anderen Bitmap anzeigen lassen... Ich bin mitlerweile nur noch müde und versteh nicht mehr viel , das wäre echt nett von dir :|

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TImage Canvas Bilder zeichnen

Beitrag von Michl »

Das erinnert mich an so ein altes Strip-Spiel aus den Anfang 90ern :mrgreen:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  try
    Image1.Picture.LoadFromFile('Image.png');
  except
    on e:exception do
      ShowMessage('File [Image.png] not found');
  end;
  Image2.Canvas.Clear;
  DoubleBuffered:=True;
end;
 
procedure TForm1.Image2Click(Sender: TObject);
var
  mp: TPoint;
begin
  mp:=Mouse.CursorPos;
  mp:=Image2.ScreenToControl(mp);
  mp.x:=(mp.x div 32) * 32;
  mp.y:=(mp.y div 32) * 32;
  Image2.Canvas.CopyRect(
    Rect(mp.x, mp.y, mp.x + 32, mp.y +32),
    Image1.Canvas,
    Rect(mp.x, mp.y, mp.x + 32, mp.y +32));
end;

oder als Project anbei (@theo: sorry, ich kanns nicht lassen :wink: )

@programmingpony: Unter Projekt -> Formulare kannst du das Formular öffnen (wird bei Lazarus 1.2.6 wahrscheinlich sonst nicht angezeigt)
Dateianhänge
TileMap.zip
(395.61 KiB) 83-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

programmingpony
Beiträge: 18
Registriert: Do 26. Mär 2015, 14:45

Re: TImage Canvas Bilder zeichnen

Beitrag von programmingpony »

Vielen Dank schonmal das ist echt Top :)

Eine weitere Frage wäre:

Kann man die Felder auch skalieren

und wie kann ich objekte wie Rectangle rotieren?

Wenn das geklärt ist habe ich nen schönen Abend beim programmieren :D

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TImage Canvas Bilder zeichnen

Beitrag von Michl »

programmingpony hat geschrieben:Kann man die Felder auch skalieren
probier es doch einfach aus, z.B.

Code: Alles auswählen

  Image2.Canvas.CopyRect(
    Rect(mp.x, mp.y, mp.x + 16 + Random(33), mp.y + 16 + Random(33)),
//    Rect(mp.x, mp.y, mp.x + 32, mp.y + 32),
    Image1.Canvas,
//    Rect(mp.x, mp.y, mp.x + 16 + Random(33), mp.y + 16 + Random(33)));
    Rect(mp.x, mp.y, mp.x + 32, mp.y + 32))
wobei dabei kein Antialiasing verwendet wird.

Wahrscheinlich ist es erstmal zu viel, doch es gibt ein externes Package mit sehr vielen guten (besser sind die englischen) Tutorials, das gute grafische Lösungen bietet: http://wiki.lazarus.freepascal.org/BGRABitmap/de
Noch etwas komplexer wird die Verwendung von OpenGL.

programmingpony hat geschrieben:und wie kann ich objekte wie Rectangle rotieren?
Ein Canvas.Rectangle ist kein Objekt, sondern eine Methode (es zeichnet ein Rechteck auf ein Canvas). Die Antwort, ob man die Methode Canvas.Rectangle mit einem Rotationswinkel aufrufen kann, ist nein. Dafür könntest du die Methode Canvas.Polygon verwenden. Oder Linien, wie in diesem Bsp: http://www.lazarusforum.de/viewtopic.php?p=71443#p71443

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

programmingpony
Beiträge: 18
Registriert: Do 26. Mär 2015, 14:45

Re: TImage Canvas Bilder zeichnen

Beitrag von programmingpony »

Ich meinte eigentlich zB ein Bildteil zu "zoomen" zB einen ausschnitt von 2*2 Feldern verkleinert auf 1*1 da zu stellen

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: TImage Canvas Bilder zeichnen

Beitrag von Michl »

programmingpony hat geschrieben:Ich meinte eigentlich zB ein Bildteil zu "zoomen" zB einen ausschnitt von 2*2 Feldern verkleinert auf 1*1 da zu stellen
Davon schrieb ich auch (einfach mal probieren):

Code: Alles auswählen

  Image2.Canvas.CopyRect(
    Rect(mp.x, mp.y, mp.x + 32, mp.y + 32),
    Image1.Canvas,
    Rect(mp.x, mp.y, mp.x + 64, mp.y + 64));   
wobei jetzt noch eine Lösung für den Randbereich gefunden werden muss.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

programmingpony
Beiträge: 18
Registriert: Do 26. Mär 2015, 14:45

Re: TImage Canvas Bilder zeichnen

Beitrag von programmingpony »

Danke funzt hatte es ein wenig überlesen / verlesen , du bist top :D

Antworten