![]() |
Grafik im Speicher erstellen für BlobStream (DB)
Hallo,
Welches Control würde man wohl am ehesten nutzen, um eine Zufallsgrafik im Speicher zu erstellen, welche als Stream für ein Datenbankfeld durchgereicht werden soll? Zufallsgrafik heißt für mich, dass ich einfach auf ein 50x50 großes Bitmap ein paar Punkte oder Text zeichnen möchte. LG Mathias |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
|
AW: Grafik im Speicher erstellen für BlobStream (DB)
Das eigenartige ist, mein Delphi erkennt TBitMap nicht mehr.
Fehlt mir eine unit? LG Mathias |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
![]() ![]() (ein klick auf einen link führt dich direkt zur TBitmap Referenz) Nachwort: Wenn Du ein Control suchst, nutze ein TImage, das ist sichtbar. TBitmap ist kein Control, es ist ein Objekt.
Delphi-Quellcode:
var
bmp: TBitmap; begin bmp := TBitmap.Create usw usf |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Danke, hat nix gebracht.
Ich habe als unit noch Vcl.Imaging.GIFImg, Vcl.Imaging.jpeg, Vcl.Imaging.pngimage drin. Hakt sich da was mit TBitMap? LG |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
LG |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Hab Antwort geupdated, hilft das?
|
AW: Grafik im Speicher erstellen für BlobStream (DB)
Dann halt mit vollem Namen. Das muss funktionieren.
Delphi-Quellcode:
procedure TForm9.FormCreate(Sender: TObject);
var bmp: Vcl.Graphics.TBitmap; begin bmp := Vcl.Graphics.TBitmap.Create; try bmp.Width := 50; bmp.Height := 50; // mach was mit dem objekt finally bmp.Free end; end; |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Jetzt habe ich auch eine aussagekräftige Fehlermeldung:
[dcc32 Fehler] Unit_Hauptformular.pas(1390): E2010 Inkompatible Typen: 'tagBITMAP' und 'TBitmap' var Dummy_Image: TBitmap; begin Dummy_Image := Vcl.Graphics.TBitmap.Create; Was ist bitte tagBITMAP? LG Edit: ![]() |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Nutze auch im var den vollen namen.
tagBITMAP ist in Windows definiert. da beißt sich was. also es gibt auch winapi.windows.tbitmap <<< deswegen |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Vielen Dank, Du hast mir sehr geholfen :-)
PS: gibt es schon eine fertige Funktion, um ein Zufallsbild zu erzeugen? LG |
AW: Grafik im Speicher erstellen für BlobStream (DB)
nicht das ich wüsste, aber per iteration (über width und height) kannst du bunte punkte setzen...
Zitat:
|
AW: Grafik im Speicher erstellen für BlobStream (DB)
nur mal auf die schnelle dahingedaddelt. erwarte keine wunder.
Delphi-Quellcode:
procedure TForm9.FormCreate(Sender: TObject);
type TRGB = record b,g,r: Byte; end; ARGB = array [0..1] of TRGB; PARGB = ^ARGB; var p: PARGB; x,y: Integer; bmp: Vcl.Graphics.TBitmap; begin bmp := Vcl.Graphics.TBitmap.Create; try bmp.PixelFormat := pf24bit; bmp.Width := 50; bmp.Height := 50; for y := 0 to (bmp.Height - 1) do begin p := bmp.ScanLine[y]; for x := 0 to (bmp.Width - 1) do begin p[x].r := Random(High(Byte)); p[x].g := Random(High(Byte)); p[x].b := Random(High(Byte)); end; end; // mach was... finally bmp.Free; end; end; |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Das ist nett :-)
:-D |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Ps: Randomize << das noch aufrufen bevor Random() aufgerufen wird, habs vergessen im oberen source.
|
AW: Grafik im Speicher erstellen für BlobStream (DB)
Danke nochmal, ich habe es in eine Function gegossen:
Delphi-Quellcode:
type TRGB = record b, g, r: Byte; end; ARGB = array [0 .. 1] of TRGB; PARGB = ^ARGB; function RandomBitmap(bmp: VCL.Graphics.TBitmap; iWidth: Integer = 225; iHeight: Integer = 225): Boolean; var ix, iy: Integer; p: PARGB; begin Result := default (Boolean); if (iWidth = 0) and (iHeight = 0) then exit; Randomize; try bmp.PixelFormat := pf24bit; bmp.Width := iWidth; bmp.Height := iHeight; for iy := 0 to (bmp.Height - 1) do begin p := bmp.ScanLine[iy]; for ix := 0 to (bmp.Width - 1) do begin p[ix].r := random(High(Byte)); p[ix].g := random(High(Byte)); p[ix].b := random(High(Byte)); end; end; finally Result := true; end; end; // Aufruf z.B.: var Dummy_Image: Vcl.Graphics.TBitmap; begin Dummy_Image := Vcl.Graphics.TBitmap.Create; RandomBitmap(Dummy_Image, random(50) + 225, random(50) + 225); // hier was mit dem Bild machen Dummy_Image.Free; end; LG und schlaf gut :-) |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Delphi-Quellcode:
minimal abgeändert, jedenfalls würde es so bei mir aussehen.
function RandomBitmap(Abmp: VCL.Graphics.TBitmap; const AWidth: Integer = 225; const AHeight: Integer = 225): Boolean;
type TRGB = record b, g, r: Byte; end; ARGB = array [0 .. 1] of TRGB; PARGB = ^ARGB; var x, y: Integer; p: PARGB; begin Result := False; if (AWidth = 0) or (AHeight = 0) then Exit(False); Randomize; if Abmp = nil then Abmp := Vcl.Graphics.TBitmap.Create; try Abmp.PixelFormat := pf24bit; Abmp.Width := AWidth; Abmp.Height := AHeight; for y := 0 to (Abmp.Height - 1) do begin p := Abmp.ScanLine[y]; for x := 0 to (Abmp.Width - 1) do begin p[x].r := Random(High(Byte)); p[x].g := Random(High(Byte)); p[x].b := Random(High(Byte)); end; end; finally Result := True; end; end; |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Und den Speicher hast Du im Griff?
|
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
Delphi-Quellcode:
?
if Abmp = nil then
Abmp := Vcl.Graphics.TBitmap.Create; Das würde bei mir auch mittels Exit, bei nil, vorher abgefangen werden. Hatte ich in meinem Code vergessen. LG |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
(kein objekt da = erschaffe eins, ist eins da = mach was) //edit (ich gebe solche objekte per freeandnil frei) |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Delphi-Quellcode:
EDIT:
if not Assigned(Abmp) then
Abmp := Vcl.Graphics.TBitmap.Create; Warum? Es wird sich immer beschwert das man NIE auf True oder False hin prüfen soll. Was ist eine Prüfung auf Nil.. Ja oder Nein, 1 oder 0, True oder False. Also es ist in jedem fall eine Prüfung darauf ob der Wert True oder False ist. Wenn man sich schon hier beschwert ->
Delphi-Quellcode:
if (x = True) then
sollte das gleiche auch bei Nil gelten. Denn Assigned liefert den korrekten wert nämlich True oder False. Es ist nicht grundsätzlich falsch auf NIL zu prüfen aber dann hat auch die Prüfung auf True wie im Beispiel seine Berechtigung. Wenn nicht dann bitte schön konsequent bleiben und auch nicht auf NIL hin prüfen. Dafür gibt es Assigned. |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Wenn das Objekt aber in der Function erstellt wurde, übersieht man dann nicht außerhalb die Freigabe?
LG 👋🏻 |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
Für mich pers. ist das der bessere Umgang da es generischer ist und (sogut wie) immer ein resultat liefert. Der eigentliche Grund warum ich überhaupt den Code abgeändert gepostet habe war deine "width and height = 0" abfrage. Wozu ein Bitmap erstellen lassen wenn eins von beiden 0 sein darf? Es tut mir leid wenn dir mein vorschlag unangehm vorkommt. Jeder kocht halt sein eigenes süppchen. |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Die übergebene Bitmap müsste aber dann ein Var-Parameter sein, sonst ist die Referenz weg, die Instanz aber weiterhin da.
|
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
Aber gut jedem das seine ;) |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
Eine "if" abfrage, egal wie man sie formuliert, bleibt immer eine True oder False abfrage. Uwe Raabe hatte doch gerade erst gezeigt das eine "if nil" und ein "if assigned()" per debugger den gleichen code ausspuckt oder irre ich mich jetzt total? Ich nehme natürlich gerne ratschläge dazu an, also Danke für Deinen Ratschlag!! :thumb: |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Nochmal für Emil zum Mitschreiben:
Delphi-Quellcode:
Deshalb vergleicht man nicht mit true, das hat mit einer Prüfung auf nil nichts zu tun.
function APICallResult: integer;
begin Result := not 0; end; procedure TForm13.Button1Click(Sender: TObject); var lBool: Boolean; begin lBool := Boolean(APICallResult); if lBool = true then ShowMessage('Vergleich mit true ergibt true') else if lBool then ShowMessage('Prüfung ohne Vergleich ergibt true'); end; |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
Wollte nur mal auf die nicht konsequente Herangehensweise hinweisen. |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
|
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
Wie man sie letztendlich prüft bleibt sich gleich. Aber wenn schon dann mit allen Variablen gleich so wie es in C++ auch stattfindet. Ok bin raus ist ein anderes Thema. |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
|
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
|
AW: Grafik im Speicher erstellen für BlobStream (DB)
Als Abschluss nochmal ein Danke an euch, vor allem KodeZwerg. Die Verbesserung ist toll!
LG Mathias |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Eine letzte Frage noch an KodeZwerg.
Warum hast Du aus meinem iWidth und iHeight ein AWidth und AHeight gemacht? Hat es etwas mit dem A auf sich? Ich hatte bisher das immer so gemacht, dass ich Variablen/Konstanten mit dem Vorzeichen des Types versehen hatte. iHeight = Integer Height. LG Mathias :-) |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Zitat:
So kann ich oftmals den Basisnamen in der Methode verwenden, das ist eigentlich alles. Bei lokalen variablen mache ich es wie Du, mal mehr mal weniger, da bin ich leider nicht konstant genug :-( Du/Ihr seid jederzeit Willkommen, ich versuche mich anzustrengen besser zu werden um hilfreicher zu sein! Durch mein Übersehen deiner Implementierung habe auch ich mal wieder was dazu gelernt... -> besser aufzupassen hehehe |
AW: Grafik im Speicher erstellen für BlobStream (DB)
Alles klar, Danke. :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 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 by Thomas Breitkreuz