Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Bereich von Image in anderes Image kopieren (https://www.delphipraxis.net/89421-bereich-von-image-anderes-image-kopieren.html)

xZise 30. Mär 2007 21:42


Bereich von Image in anderes Image kopieren
 
Ich möchte ein Teil eines Images in ein anderes Image kopieren.
Das Quellimage ist eine Aneinanderreihung von verschiedenen Wandtypen
Variablen:
  • Sourceimage = iWalls
  • Destimage = bMap
  • Teil = i
  • Feldbreite = FIELD_WIDTH
(i ist der Index des Teiles. Und ein Tei ist 48 x 48 px groß)
Ich habe es so programmiert:
Delphi-Quellcode:
bMap.Canvas.CopyRect(Rect(raster.x * FIELD_WIDTH, raster.y * FIELD_WIDTH, (raster.x + 1) * FIELD_WIDTH, (raster.y + 1) * FIELD_WIDTH), iWalls.Canvas, Rect(i * 48, 0, (i + 1) * 48, 48));
Nun nimmt er aber immer das 1. Bild und auch ist es nicht transparent.
Wie kann man das beheben?

PS: i ist korrekt!

xZise 1. Apr 2007 11:27

Re: Bereich von Image in anderes Image kopieren
 
Ich bin ratlos... Ich habe es mal getestet direkt auf ein Image zu malen, und da funktionierts einwandfrei... Aber ich finde den Fehler nirgends :(

xZise 2. Apr 2007 23:09

Re: Bereich von Image in anderes Image kopieren
 
Sorry, aber irgendwie scheint niemand sich hierfür zu interessieren?!

Ich habe auch weiter getestet, und habe festgestellt, dass es das 1. Image ist (100%). Genau richtig gesetzt und auch nichts übersehen...

marabu 3. Apr 2007 06:31

Re: Bereich von Image in anderes Image kopieren
 
Guten Morgen Fabian,

überprüfe mal deine Einstellung von bMap.Canvas.CopyMode, erkläre die Bedeutung von "raster" und reduziere die Parameter Right und Bottom von Rect() um jewils einen Pixel.

Grüße vom marabu

xZise 3. Apr 2007 09:25

Re: Bereich von Image in anderes Image kopieren
 
Zitat:

Zitat von marabu
Guten Morgen Fabian,

überprüfe mal deine Einstellung von bMap.Canvas.CopyMode

Welchen Wert sollte es haben?

Zitat:

Zitat von marabu
erkläre die Bedeutung von "raster"

raster ist vom Typ "TPoint" und gibt das Feld auf der Karte an (also nicht die Pixel sondern die Feldnummer)

Zitat:

Zitat von marabu
und reduziere die Parameter Right und Bottom von Rect() um jewils einen Pixel.

Ich habe es versucht oben zu beschreiben (#3): Die Position des Steins ist korrekt. Nur eben nicht der Stein...

marabu 3. Apr 2007 16:30

Re: Bereich von Image in anderes Image kopieren
 
Hallo Fabian,

welchen CopyMode du verwenden musst kann ich nicht sagen, da ich deine Anforderung nicht verstehe. Im Zweifelsfall probierst du sie einfach aus.

"Raster" verstehe ich jetzt so, dass die Koordinaten X und Y die Spalte und die Zeile einer Kachel in einem Grid angeben.

Wenn eine Kachel quadratisch ist und eine Kantenlänge von 48 Pixeln hat, dann beginnt die erste Kachel bei X = 0 und die zweite bei X = 48, also endet die erste bei X = 47. Du lässt sie bei 48 enden, was ein Pixel zu viel ist. Es fällt dir nur nicht auf, weil alle überflüssigen Pixel verdeckt werden, wenn du links oben mit dem Malen beginnst. Nur ein übermalter Rand rechts und unten bleibt erhalten. Verringerst du den dritten Parameter (Right) von Rect(), dann stimmt alles.

Freundliche Grüße

xZise 3. Apr 2007 22:25

Re: Bereich von Image in anderes Image kopieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke marabu ;)
Aber irgendwie ist das noch nicht alles...
Vorweg: Eine Prozedur die im "Move" ausgeführt wird, hat immer das gleiche Image gemalt und so entstand der Effekt. Aber das hat sich erledigt.

Zitat:

Zitat von marabu
welchen CopyMode du verwenden musst kann ich nicht sagen, da ich deine Anforderung nicht verstehe. Im Zweifelsfall probierst du sie einfach aus.

cmSrcCopy tuts ;)

Zitat:

Zitat von marabu
"Raster" verstehe ich jetzt so, dass die Koordinaten X und Y die Spalte und die Zeile einer Kachel in einem Grid angeben.

Korrekt ;)

Zitat:

Zitat von marabu
Wenn eine Kachel quadratisch ist und eine Kantenlänge von 48 Pixeln hat, dann beginnt die erste Kachel bei X = 0 und die zweite bei X = 48, also endet die erste bei X = 47. Du lässt sie bei 48 enden, was ein Pixel zu viel ist. Es fällt dir nur nicht auf, weil alle überflüssigen Pixel verdeckt werden, wenn du links oben mit dem Malen beginnst. Nur ein übermalter Rand rechts und unten bleibt erhalten. Verringerst du den dritten Parameter (Right) von Rect(), dann stimmt alles.

Danke aber das wars nicht ^^

Jetzt gibts ein anderes Problem: Die Quelldaten sind in den Massen 48 x 48, aber die Kartenzellen sind nur 28 x 28 px groß... An sich kein Problem, außer das es so unschöne grafische artefakte gibt.

Im Anhang siehts man ;) Zudem müsste ich transparenz kopieren... Geht das auch irgendwie?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 Uhr.

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