![]() |
Auf die Komponente Image malen?
Hallo liebe Community,
ich hab ein Problem, welches aus meiner letzten Frage ( ![]() Ich habe es schon mit einer Paintbox über dem Image versucht - hat aber leider nicht geklappt, da die Paintbox immer in den Hintergrund gerutscht ist. Wie kann ich das beheben? Oder hat jemand eine andere Idee, wie ich das beheben kann? Liebe Grüße loirad |
AW: Auf die Komponente Image malen?
Grafik erst skalieren, dann malen und dem Image zuweisen.
|
AW: Auf die Komponente Image malen?
Geht das nicht einfacher?
|
AW: Auf die Komponente Image malen?
Na so z.B. :
Delphi-Quellcode:
Gruß
Image1.Picture.LoadFromFile(.........77439.bmp');
Image1.Canvas.Pen.Color:=clwhite; Image1.Canvas.LineTo(5,5); Image1.Canvas.LineTo(150,150); Image1.Canvas.LineTo(0,5); K-H |
AW: Auf die Komponente Image malen?
Ob man aber nun auf dem Image.Canvas herumzeichnet oder auf dem der geladenen Grafik, dürfte sich nicht viel tun.
|
AW: Auf die Komponente Image malen?
Wenn Du verrätst was Du vorhast kann man Dir vielleicht gezielter helfen.
Einen Auswahlrahmen zeichnen per Code/Maus? Ein Bild in Teilbilder zerlegen nach festen Verhältnissen? .....? |
AW: Auf die Komponente Image malen?
Es ist egal ob man auf dem Canvas vom Image oder auf dem Canvas vom Bild zeichnet - bei beidem spielt die skalierung mit rein :(
@Bummi: Ich will einen Rahmen an eine ausgerechnete Position malen. Dieser Rahmen soll auf dem Image liegen. Jedoch wird beim Skalieren des Bildes der Canvas auch skaliert und dadurch Reihen von Pixeln weggelassen, wo teilweise der Rahmen lang verläuft! |
AW: Auf die Komponente Image malen?
Dann reagiere doch einfach auf die Skalierung und berechne den Rahmen neu und zeichne ihn neu.
|
AW: Auf die Komponente Image malen?
Auf die Gefahr, dass ich mich wiederhole: skalier die Grafik und male dann dort Deinen Rahmen drauf. Das Original solltest Du im Speicher behalten, dann kannst Du das Ganze auch wiederholen, ohne dass der Rahmen mitskaliert wird. Hast Du Dir mein Beispiel aus dem anderen Thread angesehen? Dort mache ich das so ähnlich, nur mit dem Unterschied, dass zuerst gemalt und dann skaliert wird, aber diese Reihenfolge kann man ja mal eben ändern.
|
AW: Auf die Komponente Image malen?
Soll der Rahmen an einer definierten Position des Grafik sein, auch bei Änderung der Imagegröße, oder an einer definierten Position innerhalb des Images, wenn ja was soll passieren wenn das Image seine Größe/Seitenverhältnisse ändert (z.b. durch Align an Client und Formgrößenänderung).
|
AW: Auf die Komponente Image malen?
@loirad
Was verstehst du unter Skalierung des Bildes? Wenn du darunter die Skalierung des TImage meinst, dann hat die keinen Einfluss auf die Bitmap. Als erstes solltest du dir abgewöhnen Begriffe wie Bild zu nutzen, da man damit nicht ganz sicher zuordnen kann was du meinst. TImage stellt nur eine Grafik visuell dar. Das kann eine Bitmap, Jpeg oder auch andere Formate sein. Sag also direkt was du meinst, die TImage oder TBitmap. Das sind zwei paar Schuh, auch wenn sie verwandt sind. Als Anfänger würde ich es mir abgewöhnen auf der TImage.Canvas zu zeichnen, auch wenn es geht. Du kommst nur durcheinander. Zeichne gleich auf der TImage.Picture.Bitmap.Canvas, dann gibt es auch keine Missverständnisse. Denn auch wenn du auf TImage.Canvas zeichnest, so zeichnest du tatsächlich auf der TImage.Picture.Bitmap.Canvas. Hier ist Bitmap die Voreinstellung und wenn du direkt auf TImage.Canvas zeichnest, dann wird eine Bitmap von den Dimensionen erstellt. Das kann aber auch mal nicht klappen und dann wunderst du dich wieso es nicht klappt. Also lieber alles selber machen und auf der sicheren Seite sein. |
AW: Auf die Komponente Image malen?
@Popov: Ok, geht klar!
@Bummi: TImage ist über den Objektinspektor gestrecht auf 500*500. Und auf das TImage soll ein Rahmen (mit Canvas) an einer bestimmten Position, unabhängig davon, welches TBitmap darauf liegt! |
AW: Auf die Komponente Image malen?
Gestrecht ist ganz schlecht. wenn das Bild nicht quadratisch ist, führt das unweigerlich zu verschieden dicken Linien.
|
AW: Auf die Komponente Image malen?
TPaintBox und TLabel haben keine eigene Zeichenfläche. :warn:
Diese zeichnen sich immer auf dem Canvas ihres Parents. Und darum landen ihre Bilder quasi auch im Hintergrund. TImage macht es zwar auch so, aber im Gegensatz zur TPaintBox hat es einen Puffer, wo das Bild immer wieder herkommt (z.B. das interne Bitmap) und dieser ist langlebiger als das ungepufferte Bild der TPaintBox. Du könntest ein weiteres TImage drüberlegen. Oder wie wäre es mit TShape, bzw. TBevel? (ich weiß jetzt aber nicht wie TBevel arbeitet ... nicht daß dieses auch im Hintergrund landet) |
AW: Auf die Komponente Image malen?
meinst Du so etwas?
|
AW: Auf die Komponente Image malen?
@mkinzler: Ich hatte vergessen zu erwähnen, dass Proportional auch auf true ist!
@himitsu: Vielen Dank für den Hinweis :thumb: Mit Image habe ich es auch schon probiert, da wird aber der Hintergrund weiß, und das Bild dahinter kann man dann nicht sehen. Ich werds mal mit einem TShape probieren! @Bummi: Ja so in etwa ja! |
AW: Auf die Komponente Image malen?
@loirad
Bist du das der mal gefragt hat wie man einen Bilderrahmen zeichnen kann? Was du hier versuchst ist eigentlich nicht so schwer, aber doch schon etwas komplexer. Du versuchst aber zu sehr den einfachen Weg zu gehen und der klappt nicht. Manchmal sollte man stoppen und ein Schritt zurück gehen. Also vorausgesetzt ich habe dein Problem richtig verstanden, dann beschreibe ich dir deinen Fehler. Du hast eine 2000x2000 Pixel große Bitmap die du in eine Image lädst. Die Image skalierst du auf 500x500 Pixel. Nun willst du auf dem Bild einen Bilderrahmen zeichnen. Das klappt aber nicht so richtig, denn die Pixel auf der Image entsprechen nicht der von dir eingestellten Größe. Der Grund ist der: auch wenn die Image das Bild skaliert, ist das Bild im Speicher immer noch das Originalbild, z. B 2000x2000 Pixel. Wenn du da jetzt einen Rahmen von 4 Pixeln zeichnest, dann ist der auf der Image 1 Pixel groß. Der Grund: du hast auf der Originalgrafik gezeichnet und die wurd von der Image skaliert. Dabei ist es egal ob du direkt auf Image.Canvas zeichnest. Wie gesagt, du zeichnest da trotzdem auf der Bitmap. Lösung: du lädst dein Bild in eine TBitmap und skalierst es manuell sie auf 500x500. Dann übergibst du sie an die TImage und schaltest vorher Scale ab. Jetzt kannst du auf der TImage zeichnen und zwei Pixel sind dann auch zwei Pixel dick. //Eidit: Hier ein kleines Beispiel
Delphi-Quellcode:
In dem Beispiel soll das ganze Bild geschwärzt werden, wird aber nur ein viertel, auch wenn die Image Größe und die Schleife gleiche Werte haben.
procedure TForm1.Button1Click(Sender: TObject);
var i, x, y: Integer; begin Image1.Width := 105; //Größe der Image Image1.Height := 105; Image1.Picture.Bitmap.Width := 210; //Größe der Bittmap, doppelt Image1.Picture.Bitmap.Height := 210; Image1.Stretch := True; for x := 0 to 105 {Width} do for y := 0 to 105 {Height} do Image1.Picture.Bitmap.Canvas.Pixels[x, y] := clBlack; {Obwohl Image1 105 Pixel groß ist, wird nur ein viertel gezeichnet} end; procedure TForm1.Button2Click(Sender: TObject); begin Image1.Stretch := not Image1.Stretch; end; |
AW: Auf die Komponente Image malen?
Wenn du ein Bitmap im TImage hast, dann mußt du natürlich die Transparenz im TImage aktivieren.
- entweder fest auf die Farbe eingestellt, welche transparent sein soll (z.B. dein Weiß aka clWhite) - oder die Farbe wird automatisch gewählt (ich glaube Anhand des Pixels, welches inten Links im Bitmap drin ist ... also das erste Pixel, denn diese Bitmaps werden von unten nach oben gespeichert) |
AW: Auf die Komponente Image malen?
Liste der Anhänge anzeigen (Anzahl: 1)
Da Du die einfache Lösung suchst ...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz