Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   jpg im TImage ansprechen (https://www.delphipraxis.net/163923-jpg-im-timage-ansprechen.html)

entwickler 21. Okt 2011 15:18

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.

Bummi 21. Okt 2011 15:43

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;

DeddyH 21. Okt 2011 16:18

AW: jpg im TImage ansprechen
 
Delphi-Quellcode:
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;
Erscheint mir einfacher.

Bummi 21. Okt 2011 16:29

AW: jpg im TImage ansprechen
 
stimmt ....:thumb:

entwickler 31. Okt 2011 12:38

AW: jpg im TImage ansprechen
 
@ DeddyH

ich muss den Bitmap aber nicht speichern, ich kann den auch so benutzen, oder?

Bummi 31. Okt 2011 12:42

AW: jpg im TImage ansprechen
 
klar....

himitsu 31. Okt 2011 12:55

AW: jpg im TImage ansprechen
 
Das war nur ein Beispiel ... also nein, mußt du nicht.
Der Wichtige teil ist
Delphi-Quellcode:
bmp.Assign(Image1.Picture.Graphic);
, welcher den Bildinhalt einer anderen Komponente zuweist, bzw. rüberkopiert.

Ansonsten ist das Bild ja in TImage.Picture enthalten, über TImage.Picture.Graphic zugänglich
und wenn man den Typ kennt,
Delphi-Quellcode:
if Assigned(Image1.Picture.Graphic) then
  ShowMessage('Bild vom Typ "' + Image1.Picture.Graphic.ClassName + '" enthalten')
else
  ShowMessage('kein Bild enthalten');
dann kann man auch auf dessen Eigenschaften zugreifen.
(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:
property Bitmap: TBitmap read GetBitmap; // volatile
> Das "volatile" steht nicht umsonst in der Deklaration. :angle2:

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:
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);
Nja, jedenfalls kann man dieses Bitmap dennoch gut nutzen, um sich dort seinen Teil rauszukopieren.
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);

entwickler 3. Nov 2011 11:23

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?

entwickler 3. Nov 2011 11:49

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?

bernhard_LA 3. Nov 2011 12:15

AW: jpg im TImage ansprechen
 
unter http://www.delphipraxis.net/164197-i...ion-ab-xe.html ein 5 zeiler um Formate umzuwandeln


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:04 Uhr.
Seite 1 von 2  1 2      

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