Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.151 Beiträge
 
Delphi 12 Athens
 
#7

AW: jpg im TImage ansprechen

  Alt 31. Okt 2011, 12:55
Das war nur ein Beispiel ... also nein, mußt du nicht.
Der Wichtige teil ist 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.
> property Bitmap: TBitmap read GetBitmap; // volatile > Das "volatile" steht nicht umsonst in der Deklaration.

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);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (31. Okt 2011 um 13:08 Uhr)
  Mit Zitat antworten Zitat