Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild im Popupmenu (https://www.delphipraxis.net/151259-bild-im-popupmenu.html)

D0N 10. Mai 2010 10:48


Bild im Popupmenu
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Ich möchte in meinem Programm ein richtiges Bild in ein Popupmenu einbauen, ich habs schon im menu drin nur es ist extrem verpixelt.
Daher wollte ich fragen ob es ich etwas machen kann dass es nichtmehr so verpixelt ist.

Hier der ausschnitt in dem ich das Bild ins Menu einfüge (glaube ich, hab mir die Canvas sachen noch nicht angeschaut)

Delphi-Quellcode:
procedure TForm1.pupImageAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; State: TOwnerDrawState);
begin
   try
     InflateRect(ARect,-5,-5) ;
     ACanvas.StretchDraw(ARect, Image1.Picture.Graphic) ;
   finally

   end;
end;
Das Bild lade ich aus dem Internet in nen Stream und von dort in das TImage (umständlich aber mir is gestern abend nich besseres eingefallen).

Delphi-Quellcode:
LDestStream := TMemoryStream.Create;
...
LJpg := TJPEGImage.Create;
LJpg.LoadFromStream(LDestStream);
image1.Picture.Assign(Ljpg);
Das Codeschnippselchen hab ich aus dem Forum hier ^^

Also wie bekomme ich es hin dass mein Bild nichtmehr so verpixelt ist?

Ein Bild des Problems ist angehängt.

mfg D0N

DeddyH 10. Mai 2010 11:01

Re: Bild im Popupmenu
 
Das sieht so aus, als ob die Proportionen nicht stimmen. Außerdem bekommt man mit SetStretchBltMode auf HALFTONE meist recht gute Ergebnisse (Wunder kann man natürlich nicht erwarten). Vielleicht hilft Dir dieser Beitrag ein wenig weiter: http://www.delphipraxis.net/internal...=978676#978676

D0N 10. Mai 2010 14:17

Re: Bild im Popupmenu
 
Wie benutze ich denn SetStretchBltMode habs zwar mal eingebunden

Delphi-Quellcode:
procedure TForm1.pupImageAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; State: TOwnerDrawState);
begin
   try
     //InflateRect(ARect,-5,-5) ;
     SetStretchBltMode(ACanvas.Handle, STRETCH_HALFTONE);
     SetBrushOrgEx(ACanvas.Handle, 0, 0, nil);
     //ACanvas.StretchDraw(ARect, Image1.Picture.Graphic) ;
     StretchBlt(ACanvas.Handle,0,0,Image1.Picture.Width,Image1.Picture.Height,Image1.Canvas.Handle,0,0, Image1.Picture.Width,Image1.Picture.Height,SRCCOPY);
   finally

   end;
end;
Bekomme aber ne Exception "Ein Bild kann nur geändert werden, wenn es einen Bitmap enthält".

Wie schon erwähnt hab ich oben den Text zusammengeknaupt weil ich nicht weiß die Canvas funktioniert.

DeddyH 10. Mai 2010 14:23

Re: Bild im Popupmenu
 
Ich an Deiner Stelle würde einfach die verlinkte Prozedur verwenden und die gestretchte JPEG dann in das Image laden, das sollte das Einfachste sein.

D0N 10. Mai 2010 14:39

Re: Bild im Popupmenu
 
Dann ist es doch trotzdem so Verpixelt da ich es ja immernoch mit

Delphi-Quellcode:
ACanvas.StretchDraw(ARect, Image1.Picture.Graphic) ;
ins Popupmenu einfüge. Das Bild sollte ja nur ne Zwischenablage zwischen Stream und Popupmenu sein.

Nur kurz zur Klärung

Ablauf:
  • Bild aus Internet in Stream laden.
  • Stream in Image (wusste nicht wie ich es sonst mit StretchDraw ins Popupmenu bekomme da es ja TGraphic will).
  • Image mit StretchDraw ins Popupmenu einfügen.

und dann isses eben so verpixelt auch wenn ich vorher die Procedure verwendet habe und das Jpg dem Image zugewiesen habe ( Assign ).

mfg

DeddyH 10. Mai 2010 14:52

Re: Bild im Popupmenu
 
Achso, dann musst Du dem Rect dann schon die Maße des (gestretchten) Bildes zuweisen.
Delphi-Quellcode:
procedure TForm1.pupImageAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; State: TOwnerDrawState);
begin
   ARect.Bottom := ARect.Top + Image1.Picture.Height;
   ARect.Right := ARect.Left + Image1.Picture.Width;
   ACanvas.StretchDraw(ARect, Image1.Picture.Graphic) ;
end;
Zumindest so in etwa müsste das funktionieren.

D0N 10. Mai 2010 15:00

Re: Bild im Popupmenu
 
klappt thx sieht gut aus.

Noch was nebenbei wenn nicht is auch nicht schlimm.

Gibt es ne möglichkeit das Bild zu zentrieren bzw was muss ich dafür ändern?

DeddyH 10. Mai 2010 15:04

Re: Bild im Popupmenu
 
Die Breite des Rects ergibt sich ja aus Right - Left. Demzufolge wäre die Mitte (Right - Left) div 2. Davon ziehst Du nun noch die halbe Bildbreite ab. Das ist dann die linke Seite. Äquivalent geht das mit der Höhe.

[edit] Mal aus dem Kopf getippt, ich hoffe, das stimmt so:
Delphi-Quellcode:
procedure TForm1.pupImageAdvancedDrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; State: TOwnerDrawState);
begin
  ARect.Left := ARect.Left + (ARect.Right - ARect.Left) div 2 - Image1.Picture.Width div 2;
  ARect.Right := ARect.Left + Image1.Picture.Width;
  ARect.Top := ARect.Top + (ARect.Bottom - ARect.Top) div 2 - Image1.Picture.Height div 2;
  ARect.Bottom := ARect.Top + Image1.Picture.Height;
  ACanvas.StretchDraw(ARect, Image1.Picture.Graphic) ;
end;
[/edit]

D0N 10. Mai 2010 15:12

Re: Bild im Popupmenu
 
ui sieht Super aus.

Das war atm alles danke für deine Mühe


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 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