![]() |
jpg im TImage ansprechen
Hallo DP,
ich habe ein Image, was eine JPG-Datei enthält. Diese Datei habe ich vor der kompillierung geladen. Nun möchte ich diese Datei in einen Bitmap zur Laufzeit umwandeln, da ich sonst keinen Bereich daraus ausschneiden kann. Wie kann ich die JPG in meinem Image1 ansprechen? Folgendes funktioniert nicht:
Delphi-Quellcode:
Form1.Image1.Picture.JPG
Ich hoffe ihr versteht, was ich meine. |
AW: jpg im TImage ansprechen
vorher Image1.Picture auf assignment prüfen ..
Delphi-Quellcode:
Procedure GetBitMap4Graphic(var bmp:TBitmap;Gra:TGraphic);
begin if Assigned(gra) then begin bmp.Width := gra.Width; bmp.Height := gra.Height; bmp.Canvas.Draw(0,0,gra); end; end; procedure TForm1.Button1Click(Sender: TObject); var bmp:TBitmap; begin bmp := TBitMap.Create; bmp.PixelFormat := pf32bit; try GetBitMap4Graphic(bmp,Image1.Picture.Graphic); bmp.SaveToFile('C:\temp\test.bmp'); finally bmp.Free; end; end; |
AW: jpg im TImage ansprechen
Delphi-Quellcode:
Erscheint mir einfacher.
procedure TForm1.Button1Click(Sender: TObject);
var bmp:TBitmap; begin bmp := TBitMap.Create; try bmp.Assign(Image1.Picture.Graphic); bmp.SaveToFile('C:\temp\test.bmp'); finally bmp.Free; end; end; |
AW: jpg im TImage ansprechen
stimmt ....:thumb:
|
AW: jpg im TImage ansprechen
@ DeddyH
ich muss den Bitmap aber nicht speichern, ich kann den auch so benutzen, oder? |
AW: jpg im TImage ansprechen
klar....
|
AW: jpg im TImage ansprechen
Das war nur ein Beispiel ... also nein, mußt du nicht.
Der Wichtige teil ist
Delphi-Quellcode:
, welcher den Bildinhalt einer anderen Komponente zuweist, bzw. rüberkopiert.
bmp.Assign(Image1.Picture.Graphic);
Ansonsten ist das Bild ja in TImage.Picture enthalten, über TImage.Picture.Graphic zugänglich und wenn man den Typ kennt,
Delphi-Quellcode:
dann kann man auch auf dessen Eigenschaften zugreifen.
if Assigned(Image1.Picture.Graphic) then
ShowMessage('Bild vom Typ "' + Image1.Picture.Graphic.ClassName + '" enthalten') else ShowMessage('kein Bild enthalten'); (Image1.Picture.Graphic as TJPEGImage).Bitmap Das TJPEGImage von delphi hat ein "geheimes" Bitmap, welche man für direkte Lesezugriffe verwenden könnte. :!: Nur Lezezugriffe möglich. (Änderungen werden nicht in das JPEG übernommen) Auch sollte an dieses nur direkt verwenden, also nur direkt nachdem man sich diese Bitmap-Referenz besort hat, denn es kann sein, daß beim nächsten zugriff auf das JPEG dieses Bitmap wieder verschwindet und somit die Referenz ungültig würde. >
Delphi-Quellcode:
> Das "volatile" steht nicht umsonst in der Deklaration. :angle2:
property Bitmap: TBitmap read GetBitmap; // volatile
Um das nutzen zu können, muß man entweder sich einen neuen Typ deklarieren (ähnlich wie Nachfolgendes) und das TJPEGImage hart casten oder man fügt einfach Folgendes an den anfang seiner Unit ein, dann wird quasi automatisch gecastet.
Delphi-Quellcode:
Nja, jedenfalls kann man dieses Bitmap dennoch gut nutzen, um sich dort seinen Teil rauszukopieren.
type
TJPEGImage = class(jpeg.TJPEGImage) public property Bitmap; end; // Oder die Kurzfassung, da unit-intern Protected-Deklarationen dennoch wie Public wirken. type TJPEGImage = class(jpeg.TJPEGImage); Wobei man statt Assign uch zeichnen kann. Das Zielbild ist kleiner und wenn nan dann noch die Quelle passend verschiebt, hat man nur noch einen Ausschnitt im Ziel. Man könnte vorher auch noch ein ClipRect über das Ziel legen, damit nur in einem bestimmten Bereich gezeichnet wird.
Delphi-Quellcode:
DeinZielCanvas.CopyRect(Zielbereich, (Image1.Picture.Graphic as TJPEGImage).Bitmap.Canvas, Quellausschnitt);
DeinZielCanvas.Draw(-100, -200, Image1.Picture.Graphic); |
AW: jpg im TImage ansprechen
Danke Himitsu!
Wo du's schon ansprichst... Mein PC ist nicht gerade der neuste und verfügt über wenig RAM und so. Nun kann ich in einem TImage nur bis zu einer bestimmten größe von X000 * X000 Pixeln zeichnen lassen (Image1.Canvas.Draw). Es belastet meinen Computer ziemlich stark, wenn ich eine 2000 x 2000 Pixel große zeichenfläche "übermale". Jetzt habe ich mir die Frage gestellt, ob ich einen Teilbereich aus einem Image anzeigen lassen kann, wobei der Rest des Bildes nicht "beachtet" wird, um darin zu zeichnen. Du hast was von ClipRect geschrieben. Wie funktioniert das genau? |
AW: jpg im TImage ansprechen
Und ich habe herausgefunden, das JPEG keine Transparenz unterstützt, daher will ich jetzt ein PNG- Bild benutzen. Wie kann ich schon vor der Compilierung eine PNG-Datei in das Image packen?
|
AW: jpg im TImage ansprechen
unter
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 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