Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap32 auf ZielBitmap32 malen (https://www.delphipraxis.net/117988-bitmap32-auf-zielbitmap32-malen.html)

stOrM 29. Jul 2008 15:19


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:
  OutMiddle.Draw(0, OutMiddle.Width, TheBar); // thebar = zielbitmap32; outmiddle = middlepart resampled
Könnte mir jemand vielleicht kurz zeigen, wie ich das Zielbitmap32 mit den Teilen aus den 3 Bitmap32 Objekten zu einem zusammensetzen kann?

Vielen Dank
s!

Medium 29. Jul 2008 15:26

Re: Bitmap32 auf ZielBitmap32 malen
 
Setzt du die Größe des Zielbitmaps bevor du darin zeichnest?

DeddyH 29. Jul 2008 15:30

Re: Bitmap32 auf ZielBitmap32 malen
 
Und zeichnest Du sicher auf das richtige Bitmap mit den korrekten Koordinaten? Sieht etwas komisch aus.

stOrM 29. Jul 2008 15:42

Re: Bitmap32 auf ZielBitmap32 malen
 
Zitat:

Zitat von Medium
Setzt du die Größe des Zielbitmaps bevor du darin zeichnest?

Hmpf! ich glaub das hab ich vergessen mom!
Ok ist gesetzt nun, aber nu hab ich nen schwarzes Rechteck ohne Grafik drin :-(

Medium 29. Jul 2008 18:32

Re: Bitmap32 auf ZielBitmap32 malen
 
Delphi-Quellcode:
  OutMiddle.Draw(0, OutMiddle.Width, TheBar); // thebar = zielbitmap32; outmiddle = middlepart resampled
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?

Ich vermute, dass die Zeile in etwa so lauten müsste:
Delphi-Quellcode:
  OutMiddle.Draw(OutLeft.Width+1, 0, TheBar);

stOrM 29. Jul 2008 19:58

Re: Bitmap32 auf ZielBitmap32 malen
 
Zitat:

Zitat von Medium
Delphi-Quellcode:
  OutMiddle.Draw(0, OutMiddle.Width, TheBar); // thebar = zielbitmap32; outmiddle = middlepart resampled
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?

Ich vermute, dass die Zeile in etwa so lauten müsste:
Delphi-Quellcode:
  OutMiddle.Draw(OutLeft.Width+1, 0, TheBar);

Moment mal gelich haben wir alle Klarheiten beseitigt :-)
Jo ich glaub ich hab da was durcheinander gewürfelt, gleich wieder da :-)

stOrM 29. Jul 2008 20:43

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);

???

Medium 30. Jul 2008 01:43

Re: Bitmap32 auf ZielBitmap32 malen
 
Zitat:

Zitat von stOrM
MittlereGrafik.Draw(0,0, Zielgrafik);
LinkeGrafik.Draw(0,0, Zielgrafik);
RechteGrafik.Draw(399, 0, Zielgrafik);

Das kommt darauf an, wie breit MittlereGrafik ist. Wenn sie die volle Breite hat ist das okay (abgesehen davon, dass 399 besser 398 sein sollte (400px = 0..399). Ansonsten muss sie natürlich um die Breite von LinkeGrafik nach rechts verschoben werden.

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.

stOrM 30. Jul 2008 09:21

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:

  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.

}
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!)

DeddyH 30. Jul 2008 09:45

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 02:54 Uhr.
Seite 1 von 6  1 23     Letzte »    

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