![]() |
Bitmap32 auf ZielBitmap32 malen
Hallo, ich hab hier grad ein Verständnisproblem bei folgendem:
3 PNG's die in drei verschiedene Bitmap32 geladen werden sollen. 1. PNG = linker Bereich (linker Rahmen) 2. PNG = mittlerer Bereich (mittlerer Bereich der Grafik) 3. PNG = rechter Bereich (rechter Rahmen) Grundidee ist folgende, ich würde gerne die 3 PNG's erstmal in 3 Bitmap32 Objekte konvertieren und danach auf eine bestimmte Größe bringen. Das klappt soweit sehr gut mit den Resamplern der Gr32. Jetzt aber kommt das Problem, ich habe jetzt ein ZielBitmap32, in dem ich meine 3 teiligen Bitmap32 Objekte wieder zusammensetzen möchte, also erst den mittleren Bereich drauf zeichen und dann halt den linken sowie rechten Bereich auf das Zielbitmap32. Das Problem ist egal was ich mache das Zielbitmap32 ist / bleibt immer leer?! ich hatte es so versucht:
Delphi-Quellcode:
Könnte mir jemand vielleicht kurz zeigen, wie ich das Zielbitmap32 mit den Teilen aus den 3 Bitmap32 Objekten zu einem zusammensetzen kann?
OutMiddle.Draw(0, OutMiddle.Width, TheBar); // thebar = zielbitmap32; outmiddle = middlepart resampled
Vielen Dank s! |
Re: Bitmap32 auf ZielBitmap32 malen
Setzt du die Größe des Zielbitmaps bevor du darin zeichnest?
|
Re: Bitmap32 auf ZielBitmap32 malen
Und zeichnest Du sicher auf das richtige Bitmap mit den korrekten Koordinaten? Sieht etwas komisch aus.
|
Re: Bitmap32 auf ZielBitmap32 malen
Zitat:
Ok ist gesetzt nun, aber nu hab ich nen schwarzes Rechteck ohne Grafik drin :-( |
Re: Bitmap32 auf ZielBitmap32 malen
Delphi-Quellcode:
Wie DeddyH schon sagte, sehen deine Koordinaten seltsam aus. Warum setzt du einen Wert mit Bezug auf die X-Achse für die Y-Position ein?
OutMiddle.Draw(0, OutMiddle.Width, TheBar); // thebar = zielbitmap32; outmiddle = middlepart resampled
Ich vermute, dass die Zeile in etwa so lauten müsste:
Delphi-Quellcode:
OutMiddle.Draw(OutLeft.Width+1, 0, TheBar);
|
Re: Bitmap32 auf ZielBitmap32 malen
Zitat:
Jo ich glaub ich hab da was durcheinander gewürfelt, gleich wieder da :-) |
Re: Bitmap32 auf ZielBitmap32 malen
Ne also irgendwas läuft hier völlig schief.
Eigentlich sollte es so sein, ClientWidth sagen wir mal beträgt 400, die Grafik "Left" ist 2 px breit und ClientHeight hoch, gleiches gilt für die Grafik Outright... Der Mittlere Bereich der Grafik in Outmiddle muss genau zwischen outleft + outright. Oder aber, eigentlich würde es glaub ich auch reichen erst Outmiddle in den gesamten ClientWidth Bereich zu zeichen und darauf dann outleft + outright, irgendwie klappt das aber nie... Irgendwie ist mir bei Graphics32 unklar wer in welcher Reihenfolge wo was draufmalen muss. Normalerweise würde ich folgerderßen vorgehen: MittlereGrafik.Draw(0,0, Zielgrafik); LinkeGrafik.Draw(0,0, Zielgrafik); RechteGrafik.Draw(399, 0, Zielgrafik); ??? |
Re: Bitmap32 auf ZielBitmap32 malen
Zitat:
Sind alle Teile passgenau, ist die Zeichenreihenfolge egal, ansonsten das zuletzt zeichnen, was "zu oberst" bzw. unverdeckt bleiben soll - alles andere wäre einfach unlogisch. Spezifiziere doch nochmal "irgendwas läuft hier völlig schief". Was siehst du, und zeige doch mal den tatsächlichen Code incl. der Stellen, an denen du die Bitmaps createst, und vor allem auch wie du die Anzeige realisierst. |
Re: Bitmap32 auf ZielBitmap32 malen
Liste der Anhänge anzeigen (Anzahl: 1)
Ok hier erstmal die Idee,
ich wollte mir die sehr komplexe Gradienterstellung sparen, die man benötigen würde um z.B. den Office2007 "orange" Gradient nachzubauen, die M$ benutzt für Selektionen in Menus oder anderen GUI Elementen. Daher dachte ich mir, könnte man ggf. in einem Grafikprogram malen, in 3 Teile unterteilen, also wie gesagt den linken, mittleren und rechten Teil und dann wenn nötig in den Canvas stretchen, z.B. in den Canvas einer Listbox und das dann als Selektionsrahmen benutzen... Damit es relativ gut aussieht, dachte ich mir ich nehm mal PNG's als Ausgangsgrafik bastel mir die in Bitmap32 um damit ich den Resamplingfilter bentuzen kann und gut iss?! Die PNG's im Anhang (die sind so eigentlich auch nicht richtig, normalerweise müßte ich die noch öfter unterteilen, da sonst im mittleren Bereich beim resizen, der Radial Gradient Effekt verloren geht, wäre aber schon froh wenns mal so klappen würde)... Die Unterteilung war generell notwendig, da wenn nicht der runde Randbereich, der eine andere Farbe hat als der mittlere Teil natürlich mit gestreckt würde, was in dem Fall sehr übel aussieht.
Delphi-Quellcode:
Was ich sehe, wenn ich an Outmiddle etwas anders einstelle (Größe verkleinern, sowie Position, damit ich die linke und rechte Grafik neben, den Mittelteil malen kann und nicht drüber, dann sehe ich nur 2 schwarze Ränder) Wenn ich auf dem Mittelteil malen will, sehe ich nur die rechten oder linken Grafik auf den mittleren Bereich aber nie beide!)SelectionLeft := TBitmap32.Create; SelectionMiddle := TBitmap32.Create; SelectionRight := TBitmap32.Create; LoadPNGintoBitmap32(SelectionLeft, ExtractFilePath(ParamStr(0)) + 'left.png', Alpha); LoadPNGintoBitmap32(SelectionMiddle, ExtractFilePath(ParamStr(0)) + 'middle.png', Alpha); LoadPNGintoBitmap32(SelectionRight, ExtractFilePath(ParamStr(0)) + 'right.png', Alpha); OutLeft := TBitmap32.Create; Outleft.Width := 2; Outleft.Height := Listbox1.ItemHeight; OutMiddle := TBitmap32.Create; Outmiddle.Width := Listbox1.ClientWidth; Outmiddle.Height := Listbox1.ItemHeight; OutRight := TBitmap32.Create; OutRight.Width := 2; OutRight.Height := Listbox1.ItemHeight; // rescale srcBitmap32, dstBtimap32, hight, width) RescalePic(SelectionLeft, OutLeft, Listbox1.ItemHeight, 2); RescalePic(SelectionMiddle, OutMiddle, Listbox1.ItemHeight, Listbox1.ClientWidth); RescalePic(SelectionRight, OutRight, Listbox1.ItemHeight, 2); TheBar := TBitmap32.Create; TheBar.Width := Listbox1.ClientWidth; TheBar.Height := Listbox1.ItemHeight; OutMiddle.Draw(0, 0, OutLeft); OutMiddle.Draw(Listbox1.ClientWidth, 0, OutRight); TheBar.Draw(0, 0, OutMiddle); { später wollte ich dann, wenn benötigt TheBar.DrawTo(Listbox1.Canvas.Handle ,Rect.left, Rect.Top); benutzen um die zusammengesetze Grafik anzuzeigen. } |
Re: Bitmap32 auf ZielBitmap32 malen
Ich weiß jetzt nicht, wie das bei TBitmap32 aussieht, aber es sollte doch im Prinzip so gehen:
- Setze Breite der Zielbitmap auf Gesamtbreite der 3 Quellbitmaps und Höhe auf die der höchsten Quellbitmap - Zeichne an Position 0,0 die linke Quellbitmap - Zeichne an Position linke Quellbitmap.Breite, 0 die mittlere - Zeichne an Position Gesamtbreite(linke und mittlere) die rechte - Speichere die Zielbitmap |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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