Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Grafik im Speicher erstellen für BlobStream (DB) (https://www.delphipraxis.net/207654-grafik-im-speicher-erstellen-fuer-blobstream-db.html)

NoGAD 19. Apr 2021 20:46

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

KodeZwerg 19. Apr 2021 21:14

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Zitat von NoGAD (Beitrag 1487421)
Bitmap

genau das :-]

NoGAD 19. Apr 2021 21:15

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Das eigenartige ist, mein Delphi erkennt TBitMap nicht mehr.

Fehlt mir eine unit?

LG Mathias

KodeZwerg 19. Apr 2021 21:18

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Zitat von NoGAD (Beitrag 1487424)
Fehlt mir eine unit?

Vcl.Graphics bzw FMX.Graphics
(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

NoGAD 19. Apr 2021 21:30

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

NoGAD 19. Apr 2021 21:32

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Zitat von KodeZwerg (Beitrag 1487426)
Nachwort:
Wenn Du ein Control suchst, nutze ein TImage, das ist sichtbar. TBitmap ist kein Control, es ist ein Objekt.

Ja, ich meinte ein Objekt. Es muss nicht sichtbar sein, ich benötige nur Zufallsgrafiken (50x50 z.B.).

LG

KodeZwerg 19. Apr 2021 21:32

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Hab Antwort geupdated, hilft das?

KodeZwerg 19. Apr 2021 21:38

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;

NoGAD 19. Apr 2021 21:48

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: https://www.delphipraxis.net/192782-...verwendet.html dort war die Lösung versteckt :roll:

KodeZwerg 19. Apr 2021 21:50

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

NoGAD 19. Apr 2021 21:52

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

KodeZwerg 19. Apr 2021 21:56

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:

Zitat von NoGAD (Beitrag 1487434)
Vielen Dank, Du hast mir sehr geholfen :-)

Gerne!

KodeZwerg 19. Apr 2021 22:07

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;

NoGAD 19. Apr 2021 22:15

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Das ist nett :-)

:-D

KodeZwerg 19. Apr 2021 22:29

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Ps: Randomize << das noch aufrufen bevor Random() aufgerufen wird, habs vergessen im oberen source.

NoGAD 20. Apr 2021 01:15

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 :-)

KodeZwerg 20. Apr 2021 18:40

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Delphi-Quellcode:
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;
minimal abgeändert, jedenfalls würde es so bei mir aussehen.

DeddyH 21. Apr 2021 07:47

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Und den Speicher hast Du im Griff?

NoGAD 21. Apr 2021 08:37

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Zitat von DeddyH (Beitrag 1487491)
Und den Speicher hast Du im Griff?

Meinst Du bezüglich KodeZwerg's

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

KodeZwerg 21. Apr 2021 09:19

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Zitat von DeddyH (Beitrag 1487491)
Und den Speicher hast Du im Griff?

Definitiv positiv.
(kein objekt da = erschaffe eins, ist eins da = mach was)


//edit
(ich gebe solche objekte per freeandnil frei)

venice2 21. Apr 2021 09:30

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Delphi-Quellcode:
 if not Assigned(Abmp) then
    Abmp := Vcl.Graphics.TBitmap.Create;
EDIT:
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.

NoGAD 21. Apr 2021 09:57

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 👋🏻

KodeZwerg 21. Apr 2021 10:06

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Zitat von NoGAD (Beitrag 1487496)
Wenn das Objekt aber in der Function erstellt wurde, übersieht man dann nicht außerhalb die Freigabe?

LG ����

Da ich ja eigentlich weiß wann ich etwas erschaffe, ob per methode oder per .Create, weiß ich auch das ich es freizugeben habe. (ich nutze halt freeandnil)
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.

DeddyH 21. Apr 2021 10:07

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.

venice2 21. Apr 2021 10:08

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

(ich nutze halt freeandnil)
Nur nötig bei Objekten die sich nicht selbst freigeben also die Rückgabe nicht Nil ist nach Free!
Aber gut jedem das seine ;)

KodeZwerg 21. Apr 2021 10:14

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Zitat von venice2 (Beitrag 1487495)
Delphi-Quellcode:
 if not Assigned(Abmp) then
    Abmp := Vcl.Graphics.TBitmap.Create;
EDIT:
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.

Inhaltlich beißt sich da irgendwie die katze am eigenen schwanz, oder?
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:

DeddyH 21. Apr 2021 10:14

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Nochmal für Emil zum Mitschreiben:
Delphi-Quellcode:
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;
Deshalb vergleicht man nicht mit true, das hat mit einer Prüfung auf nil nichts zu tun.

venice2 21. Apr 2021 10:16

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Inhaltlich beißt sich da irgendwie die katze am eigenen schwanz, oder?
Richtig!
Wollte nur mal auf die nicht konsequente Herangehensweise hinweisen.

KodeZwerg 21. Apr 2021 10:18

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Zitat von DeddyH (Beitrag 1487499)
Die übergebene Bitmap müsste aber dann ein Var-Parameter sein, sonst ist die Referenz weg, die Instanz aber weiterhin da.

Ahhhhh. Ich spring ausm Fenster. Das stimmt! Das habe ich übersehen! Danke!!

venice2 21. Apr 2021 10:19

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Deshalb vergleicht man nicht mit true, das hat mit einer Prüfung auf nil nichts zu tun.
Für dich zum mitschreiben es gibt nur 2 werte 0 oder <> 0 (VB = -1) btw. 1
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.

DeddyH 21. Apr 2021 10:22

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Zitat von venice2 (Beitrag 1487505)
Für dich zum mitschreiben es gibt nur 2 werte 1 oder 0.

Eben nicht, siehe mein Beispiel. Aber mir ist es auch egal, ob Deine Programme funktionieren oder nicht.

venice2 21. Apr 2021 10:27

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Zitat von DeddyH (Beitrag 1487506)
Zitat:

Zitat von venice2 (Beitrag 1487505)
Für dich zum mitschreiben es gibt nur 2 werte 1 oder 0.

Eben nicht, siehe mein Beispiel.

Lies mein Edit!

NoGAD 21. Apr 2021 15:57

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

NoGAD 21. Apr 2021 16:02

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 :-)

KodeZwerg 21. Apr 2021 16:18

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Zitat:

Zitat von NoGAD (Beitrag 1487534)
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 :-)

Es gibt faktisch keinen Unterschied, ich habe mir von anderen das "A" angewöhnt, auch in Class nutze ich das enorm häufig, egal was für ein Datentyp.
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

NoGAD 21. Apr 2021 16:44

AW: Grafik im Speicher erstellen für BlobStream (DB)
 
Alles klar, Danke. :)


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