Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism TObject zu System.Byte[] casten und Bitmap zuweisen ??? (https://www.delphipraxis.net/65904-tobject-zu-system-byte%5B%5D-casten-und-bitmap-zuweisen.html)

winx 22. Mär 2006 08:15


TObject zu System.Byte[] casten und Bitmap zuweisen ???
 
Hallo,

ich habe folgendes Problem:

Ich hab eine Funktion, die ein TObject übergeben bekommt. In diesem TObject steckt ein
Array aus lauter Bytes. Die Bytes sind Daten eines Bitmaps, welches ich in
einer PictureBox anzeigen will...

Wie funktioniert sowas...

Wie kann ich ein TObject zu einem Stream oder erstmal zu einem ByteArray casten und
dieses einem Bitmap zuweisen ???

Habt ihr Ideen?

Danke,
winx

alzaimar 22. Mär 2006 08:32

Re: TObject zu System.Byte[] casten und Bitmap zuweisen ???
 
Wie stecken den die Bytes im Objekt?

winx 22. Mär 2006 08:41

Re: TObject zu System.Byte[] casten und Bitmap zuweisen ???
 
Wenn ich

object.tostring() aufrufe erscheint System.Byte[]

mehr weiss ich leider auch nicht, ruf ne bereits vorhandene DLL auf.

Khabarakh 22. Mär 2006 12:49

Re: TObject zu System.Byte[] casten und Bitmap zuweisen ???
 
In welcher Form liegt der Bytestrom vor? Wenn er eine vollständige BMP-Datei, also inklusive Header, beinhaltet, kannst du das Array in einen Stream einlesen und diesen dem Bitmap-Konstruktor übergeben. Wenn nur die Pixeldaten enthalten sind, könntest P/Invoke nutzen oder eben zu Fuß die Sache erledigen ;) .
Code:
[DllImport("Gdi32")]
private static extern IntPtr CreateBitmap(int width, int height, uint planes, uint bitsPerPel, byte[] pixelData);

winx 22. Mär 2006 13:38

Re: TObject zu System.Byte[] casten und Bitmap zuweisen ???
 
danke,
es ist eine vollständige Bitmap Datei, diese wurde früher als OleVariant übergeben und mit diesem Code angezeigt:

Delphi-Quellcode:
procedure Tmainform.ConvertOleVarianttoBitmap(Data : OleVariant);
var
  ms : TMemoryStream;
  p : Pointer;
  MyBitmap : TBitmap;
begin
  ms:=TMemoryStream.Create;
  p:=VarArrayLock(Data);
  try
    ms.Write(p^,VarArrayHighBound(Data,1)+1);
  finally
    VarArrayUnlock(Data);
  end;
  ms.seek(0,soFromBeginning);
  myBitmap:=TBitmap.Create;
  myBitmap.LoadFromStream(ms);
  image.Picture.Assign(myBitmap);
  ms.Free;
  myBitmap.Free;
end;
Wie mach ich denn das ganze jetzt wenn ein TObject übergeben wird, dass ich in einem
Stream umwandeln und damit das Bitmap erzeugen will.

Kannst du mir vielleicht ein kleines Codebsp posten?

Danke,
winx

Khananka 24. Mär 2006 13:25

Re: TObject zu System.Byte[] casten und Bitmap zuweisen ???
 
Hast Du schon mal ein einfaches Unboxing probiert ? Ich stelle mir da folgendes vor:
Delphi-Quellcode:
uses System.IO;
type bytearray = Array of Byte;

procedure test(o: TObject);
var
  a: ByteArray;
  s: MemoryStream;
begin
  A := ByteArray(o);
  s := MemoryStream.Create(A);
end;
Hab's aber noch nicht getestet :oops: - probier's einfach mal aus.

Hth,
Khananka

winx 24. Mär 2006 13:49

Re: TObject zu System.Byte[] casten und Bitmap zuweisen ???
 
Das funktioniert so,doch leider ist das Bild das
mir in der PictureBox angezeigt wird, immer leer :-(
obwohl ich beim debuggen festgestellt habe, das der
Bytestream nicht leer ist!!!

Der Code sieht wie folgt aus:

Delphi-Quellcode:
function TRemoteController.ConvertObjecttoBitmap(data : TObject):Bitmap;
var
  ms : MemoryStream;
  preview : Bitmap;
  byteArray : TBytes;
  i: Integer;
begin

  byteArray := TBytes(Data);
  ms:= MemoryStream.Create(byteArray);
  preview := Bitmap.Create(ms);
  ms.Close();

  preview.Save('C:\\testPreview.bmp');

  result := preview;

end;
Wisst ihr wo der Fehler liegen kann??? Auch das gespeicherte BMP ist nur weiss...

Danke,
winx

Elvis 24. Mär 2006 13:50

Re: TObject zu System.Byte[] casten und Bitmap zuweisen ???
 
FYI, D.Net braucht keine unnützen Hilfstypen für arrays mehr.
Ist zwar Jahrhunderte her, alsi ich D.Net das letzte Mal angefasst habe, aber es sollte auch einfach so gehen:
Delphi-Quellcode:
var
  bytes : array of Byte;
begin
  bytes := someObject as array of Byte;
Wie's mit dem VCL.Net Krempel aussieht -> kA...

Khananka 24. Mär 2006 13:56

Re: TObject zu System.Byte[] casten und Bitmap zuweisen ???
 
@elvis:
Netter Versuch, aber der Compiler frisst den Cast erst gar nicht. Ausserdem ist die IDE auch bei .NET-Projekten ganz groß darin, solche Hilfstypen zu erstellen.

Khananka

Khananka 24. Mär 2006 14:01

Re: TObject zu System.Byte[] casten und Bitmap zuweisen ???
 
Zitat:

Das funktioniert so,doch leider ist das Bild das
mir in der PictureBox angezeigt wird, immer leer
obwohl ich beim debuggen festgestellt habe, das der
Bytestream nicht leer ist!!!
Ich glaube, Du musst die Position im MemoryStream nach dem Schreiben wieder auf 0 zurücksetzen, sonst versucht er am Ende des Streams zu lesen ...

Khananaka


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.
Seite 1 von 2  1 2      

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