Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Picture2Bitmap (https://www.delphipraxis.net/76116-picture2bitmap.html)

backdraft 30. Aug 2006 07:45


Picture2Bitmap
 
Hallo,

ich habe ein Bild mit
Delphi-Quellcode:
SetOlePicture(Image1.Picture, MODIMiDocView1.ImageSelection.ExportToPicture(0, 0));
in meine Eigenschaft Picture geladen.

Ich muss auf das Bild aber jetzt als Bitmap zugreifen.
Wie bekomme ich es jetzt hin, das ich in der Eigenschaft
Delphi-Quellcode:
Image1.Picutre.Bitmap
auch das Bild habe?
Falls ich darauf zugreife, sagt er mir, dass das Bitmap ungültig ist.

Danke Oliver

Mavarik 30. Aug 2006 07:52

Re: Picture2Bitmap
 
Zitat:

Zitat von backdraft
Falls ich darauf zugreife, sagt er mir, dass das Bitmap ungültig ist.

Danke Oliver

Bist Du Dir sicher, dass es sich dabei um eine *.BMP handelt?

Es könnte eine JPEG Datei sein, oder über OLE werden META Daten übertragen...?!?

Frank :coder:

backdraft 30. Aug 2006 07:53

Re: Picture2Bitmap
 
Zitat:

Zitat von Mavarik
Zitat:

Zitat von backdraft
Falls ich darauf zugreife, sagt er mir, dass das Bitmap ungültig ist.

Danke Oliver

Bist Du Dir sicher, dass es sich dabei um eine *.BMP handelt?

Es könnte eine JPEG Datei sein, oder über OLE werden META Daten übertragen...?!?

Frank :coder:

Ne es ist ja gerade keine BMP, deswegen frag ich ja, wie ich dahin komme. Das Quellformat ist MDI oder TIFF.
Über TGraphic kann ich drauf zugreifen.

backdraft 30. Aug 2006 13:00

Re: Picture2Bitmap
 
Zitat:

Zitat von backdraft
Hallo,

ich habe ein Bild mit
Delphi-Quellcode:
SetOlePicture(Image1.Picture, MODIMiDocView1.ImageSelection.ExportToPicture(0, 0));
in meine Eigenschaft Picture geladen.

Ich muss auf das Bild aber jetzt als Bitmap zugreifen.
Wie bekomme ich es jetzt hin, das ich in der Eigenschaft
Delphi-Quellcode:
Image1.Picutre.Bitmap
auch das Bild habe?
Falls ich darauf zugreife, sagt er mir, dass das Bitmap ungültig ist.

Danke Oliver


DGL-luke 30. Aug 2006 13:07

Re: Picture2Bitmap
 
ääähm...

Delphi-Quellcode:
function GetBitmap(pic: TPicture): TBitmap;
begin
  Result := TBitmap.Create;
  Result.Assign(pic{.Graphic});
end;
Ich glaube, das KÖNNTE funktionieren...

DGL-luke 29. Sep 2006 15:55

Re: Picture2Bitmap
 
möp... geht nicht...

Aber das:

Delphi-Quellcode:
procedure GetBitmap(const Graphic: TGraphic; out Bitmap: TBitmap);
begin
  if Bitmap = nil then
    Bitmap := TBitmap.Create;
  Bitmap.SetSize(Graphic.Width,Graphic.Height);
  Bitmap.Canvas.Draw(0,0,Graphic);
end;
Zumindest mit JPEG.

EDIT: tpicture->tgraphic

Khabarakh 29. Sep 2006 16:32

Re: Picture2Bitmap
 
Jupp. Mit einer ungefähren Wahrscheinlichkeit von 2,3 * 10^-10, weshalb es mich wundert, dass es bei dir funktioniert hat :stupid: .
Aber anstatt die fehlerhafte erste Zeile zu entfernen, warum nicht gleich eine Funktion benutzen? Den ersten Parameter könnte man noch zu TGraphic vereinfachen, aber das wäre nur noch ein wenig Kosmetik.

DGL-luke 29. Sep 2006 16:37

Re: Picture2Bitmap
 
ja wie jetzt? Geht es so oder nicht? Entweder es geht hundertprozentig oder gar nicht...

Khabarakh 29. Sep 2006 16:48

Re: Picture2Bitmap
 
Oder es geht nur, wenn der uninitialisierte Bitmap-Parameter zufällig nil beinhaltet. Wobei ich nicht beachtet habe, dass als Argument ein Feld übergeben werden könnte (das ja stets mit 0 initialisiert wird), aber eine immer funktionierende Funktion wäre trotzdem schöner ;) .

DGL-luke 30. Sep 2006 22:07

Re: Picture2Bitmap
 
Wenn der Anwender zu blöde ist, das Ding zu initialisieren, ist er selber schuld :roll:

Wenn ich das Bitmap als Rückgabeparameter nehme, gibts wieder Probleme mit Speicherlecks, weil der Anwender wiederum zu blöd ist, das Zeug freizugeben.

Also entweder - oder. Da es in Delphi leider keine saubere (= zuverlässige und elegante) Möglichkeit gibt, ein Objekt auf seine Existenz hin zu überprüfen bzw. ob hinter einem Pointer eine Instanz oder Speichermüll (der berüchtigte "wilde zeiger") steht (es lebe .Net/Java :mrgreen: ), hab ich keine Chance, das ganze wasserdicht zu machen.

Also was wäre deine "immer funktionierende Funktion" bitte?

Khabarakh 30. Sep 2006 22:54

Re: Picture2Bitmap
 
Wir können dem Anfänger wahrlich nicht helfen, an das Freigeben eines Funktionsergebnisses zu denken, das ist sein Problem allein.
Aber kein Profi der Welt würde je auf die Idee kommen, dass ein out-Parameter der Vorbelegung bedarf, weil es dessen Bedeutung ad absurdum führt. Jedenfalls solange er nicht in den Code schaut, und dann würde er ihn flugs umschrauben, um nicht noch einmal auf die Nase zu fliegen ;) .

DGL-luke 30. Sep 2006 22:58

Re: Picture2Bitmap
 
Hmm... ja... hab ich auch schon drüber nachgedacht. Sollte man vielleicht einen var-parameter (EDIT: also out->var) draus machen? also ich will da wirklich keine Speicherleichen produzieren. Lieber mal vom Debugger unsanft drauf hingewiesen werden, seine Variablen ordentlcih zu initialisieren. Denn das fällt auf, im gegensatz zu Speicherlecks.

3_of_8 30. Sep 2006 23:06

Re: Picture2Bitmap
 
Bei Klassen ist es recht egal ob nichts, var, out oder const. Kommt immer aufs gleiche raus.

mkinzler 30. Sep 2006 23:08

Re: Picture2Bitmap
 
Zitat:

Zitat von 3_of_8
Bei Klassen ist es recht egal ob nichts, var, out oder const. Kommt immer aufs gleiche raus.

???

3_of_8 30. Sep 2006 23:09

Re: Picture2Bitmap
 
Ich meine, wenn man eine Klasse als Parameter übergibt, ist der Zusatz egal.

mkinzler 30. Sep 2006 23:11

Re: Picture2Bitmap
 
Auch da wäre ich mir nicht sicher.

3_of_8 30. Sep 2006 23:14

Re: Picture2Bitmap
 
Ich mir schon.

kein Zustatz: Instanzenpointer wird übergeben.
var-Zusatz: Pointer auf Instanzenpointer macht keinen Sinn -> Instanzenpointer wird übergeben.
const-Zusatz: Instanzenpointer wird übergeben.
out-Zusatz: Instanzenpointer wird übergeben.

Hawkeye219 30. Sep 2006 23:17

Re: Picture2Bitmap
 
Manuel, was passiert, wenn der Parameter in der aufgerufenen Routine verändert wird?

Gruß Hawkeye

3_of_8 30. Sep 2006 23:21

Re: Picture2Bitmap
 
Call by reference. ;)

Klar, wenn der Instanzenpointer übergeben ist.

Denn wie will Delphi eine Klasseninstanz kopieren? Also eine einfache Kopie wie bei Strings geht nicht.

turboPASCAL 1. Okt 2006 06:52

Re: Picture2Bitmap
 
Das Thema "Picture2Bitmap" hatten wir schon mal. Das umwandeln auch. :stupid:

Auf Canvas bei TImage zeichnen

Delphi-Quellcode:
procedure ConvertImageToBitmap(Image: TImage);
var TmpPic: TPicture;
begin
  TmpPic := TPicture.Create;
  try
    TmpPic.Bitmap.Assign(Image.Picture.Graphic);
    Image.Picture.Bitmap.Assign(TmpPic.Bitmap);
  finally
    TmpPic.Free;
  end;
end;

Khabarakh 1. Okt 2006 10:41

Re: Picture2Bitmap
 
Zitat:

Zitat von 3_of_8
Call by reference. ;)

Klar, wenn der Instanzenpointer übergeben ist.

Denn wie will Delphi eine Klasseninstanz kopieren? Also eine einfache Kopie wie bei Strings geht nicht.

Denk nochmal drüber nach ;) . Du darfst nicht zu abstrahiert denken, jede Objektreferenz ist erst einmal ein LongInt. Wie würden sich die verschiedenen Parameterattribute auf diesen Integer auswirken? Und was bedeutet das nun jeweils für die gesamte Referenz?
var und out haben durchaus ihren Sinn, const ändert wie bei allen primitiven Typen (besonders eben LongInt) nicht viel.

PS: var-Parameter würde ich bei dieser Funktion nicht benutzen, schließlich ist der vorherige Inhalt des Bitmaps der Funktion schnurzegal. Oder man macht es auf TPs Art ;) .

DGL-luke 1. Okt 2006 12:04

Re: Picture2Bitmap
 
Meine Frage nach "var" war ja auch eher kosmetischer Art.


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