Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Image aus ImageComboBox in ein BlobField abspeichern (https://www.delphipraxis.net/58286-image-aus-imagecombobox-ein-blobfield-abspeichern.html)

AirJordan 4. Dez 2005 22:01

Datenbank: AbsoluteDatabase • Version: 4.89 • Zugriff über: AbsoluteDatabase Komponenten

Image aus ImageComboBox in ein BlobField abspeichern
 
Hallo :wink:

ich habe zu meiner Frage hier im Forum leider nicht die passende Antwort gefunden. Es gab zwar schon viele Tipps
und Tricks zu diesem Thema, aber für mein "Fall" konnte ich nichts passendes finden.

Eines vorweg, ich möchte diesen Teil in meinem Programm genau so mit den Komponenten lösen. Ich habe hier viele
andere Lösungsansätze gefunden, die aber bei mir so nicht funktionieren.

Zu dem Problem:

Ich habe in einer TImageComboBox (DevExpress) eine Liste mit Farbelementen vorgegeben. Jeder Einrag in der Liste
besteht aus dem Image, einem Text wie die Farbe heißt und einem Value (Word) der die Verbindung zu einer ImageList
hält.

Wird jetzt in einem Dialog eine Farbe ausgewählt, soll aufgrund der Auswahl mit GetBitmap und dem Bildindex aus
der ImageList die Grafik geholt werden und in dem BlobField abgespeichert werden. Die Lösungen die ich hier ge-
funden habe, gingen immer über einen OpenPictureDialog oä. und haben dann die Daten in dem BlobField geschrieben.

Delphi-Quellcode:
ImageBlobStream := TABSBlobStream(tABSTable.CreateBlobStream(tABSTable.FieldByName('Farbcode'),bmWrite));
iFarbe := TBitmap.Create; { das einzelne Bild }

{ Farben ist die gesamte ImageList }
if Farben.GetBitmap(cxFarben.EditValue,iFarbe) then
begin
  iInsulinFarbe.SaveToStream( -> ???); { hier kann ja nicht das ImageBlobStream rein ... }
  ImageBlobStream.CopyFrom(-> ???, -> ???.SizeOf) { und das kann ich auch nicht nehmen, weil ich das Bitmap nicht
                                                  { in ein TStream bekomme }
end;
Seit ein paar Stunden merke ich, das ich mich im Kreis drehe. Hat von euch noch einer eine Idee, wie man das
Problem lösen kann?? Bin für jeden Tipp dankbar.

marabu 5. Dez 2005 06:46

Re: Image aus ImageComboBox in ein BlobField abspeichern
 
Hallo,

ich kann das nicht testen, da ich die DevExpress Komponente nicht installiert habe, aber warum solltest du nicht in den ImageBlobStream schreiben können - vorausgesetzt du verwendest iFarbe statt iInsulinFarbe:

Delphi-Quellcode:
var
  bsFarbCode: TStream;
  bmFarbe: TBitmap;
  iImage: integer; // index of image in imageList
begin
  with tABSTable do
    bsFarbCode := CreateBlobStream(FieldByName('Farbcode'), bmWrite);
  bmFarbe := TBitmap.Create;
  iImage := cxFarben.EditValue; // musst du wissen, ob das okay ist
  if ilFarben.GetBitmap(iImage, bmFarbe) then
    bmFarbe.SaveToStream(bsFarbCode);
  bmFarbe.Free;
  bsFarbCode.Free;
end;
Vorweihnachtliche Grüße vom marabu

AirJordan 5. Dez 2005 08:48

Re: Image aus ImageComboBox in ein BlobField abspeichern
 
:thumb: Danke an den vorweihnachtlich grüßenden Marabu! :cheers:

Ich weiß nicht was ich da gestern Abend zusammengetippt habe, jedenfalls klappt es so wie
Marabu es beschrieben hat. :-D

Dabei habe ich dann festgestellt :roll:, das in dem Grid die Daten nur angezeigt werden,
wenn das Grafikformat auf JPEG steht, also muss ich anstatt TBitmap JPEG nehmen, aber das
werde ich wohl noch hinbekommen. Hier im Forum standen zu diesem Thema ja genug Hinweise.

Ich habe mich wohl davon etwas verwirren lassen, das Absolute Database eine eigene Variante
vom TBlobStream nämlich TABSBlobStream hat. Naja egal, Exeptions tauchen auch nicht mehr auf
und es funzt (bis auf das Format) :mrgreen:

AirJordan 5. Dez 2005 16:26

Re: Image aus ImageComboBox in ein BlobField abspeichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich nochmal :wink:

Ich habe jetzt nur noch das Problem, das mein Bitmap, das ich später in ein JPEG umwandel,
nicht so ganz passend in dem BlobField im Grid angezeigt wird. Siehe Anhang.

Wie kann ich das Bild so stretchen, das es in das Rechteck (55x8) reinpasst??? :roll:

Hier der Sourcecode aus dem Programm:

Delphi-Quellcode:
  [..]
  bsFarbCode := DIAInsuline.CreateBlobStream(FieldByName('Farbcode'), bmWrite);
  bmFarbeBMP := TBitmap.Create; { das temp. Bitmap }
  bmFarbeJPG := TJPegImage.Create; { das JPEG }

  { Bild aus der Imageliste holen. Je nach Auswahl in der ComboBox }
  if InsulinFarben.GetBitmap(cxIW_ICBInsulinFarben.EditValue,bmFarbeBMP) then
  begin
    bmFarbeBMP.Width := 55; bmFarbeBMP.Height := 8;
    { Das wäre die Größe die im Grid angezeigt wird }
    bmFarbeJPG.Assign(bmFarbeBMP); { an das JPEG anhängen }
    bmFarbeJPG.SaveToStream(bsFarbCode); { und ab in den Stream }
  end;
  bmFarbeJPG.Free; { und zum Schluß raus aus dem Speicher }
  bmFarbeBMP.Free;
  bsFarbCode.Free;
  [..]
und im Anhang das Ergebnis. Ich möchte dass das ganze Rechteck mit der Farbe gefüllt
ist. Hat einer eine Idee?

marabu 5. Dez 2005 18:40

Re: Image aus ImageComboBox in ein BlobField abspeichern
 
Hallo Holger,

wenn du der Bitmap nachträglich neue Dimensionen verpasst, dann wird sie nicht automatisch skaliert. Zum Skalieren kannst du die Methode StretchDraw() von TCanvas oder die Windows API Funktion StretchBlt() verwenden. Eventuell hält deine JPEG Komponente eine entsprechende Methode zum Skalieren für dich bereit.

Unter uns - warum speicherst du nicht einfach den FarbCode in der Datenbank und malst das Rechteck zur Laufzeit mit der gewünschten Farbe an? Das Speichern einer Bitmap ist doch in deinem Anwendungsfall nicht wirklich notwendig - oder?

Grüße vom marabu

AirJordan 5. Dez 2005 19:03

Re: Image aus ImageComboBox in ein BlobField abspeichern
 
Hallo Marabu,

unter uns gesagt: :wink: weil es zu einfach ist. :zwinker:

Nein, im Ernst. Diese Farbcodes der Insuline sind identisch mit denen auf der Verpackung. Ich bin
einfach zu faul diesen Farbcode in der Farbpalette rauszusuchen und zu vergleichen. Wir Diabetiker
erkennen damit eben auch an der Farbe die richtigen Patronen und Verpackungen.

Ich weiß keine sooooo dolle Begründung, aber deshalb habe ich mir die Bitmap´s bzw. JPEG aus dem
Netz kopiert und habe so exakt die richtigen Farben in meinem Programm. :-D

Die JPEG Komponente ist die Delphi Standard Komponente. Da habe eine Möglichkeit zum Skalieren
nicht gefunden. Trotzdem danke für deine Hinweise, haben ja schon :coder2: geholfen

marabu 5. Dez 2005 19:11

Re: Image aus ImageComboBox in ein BlobField abspeichern
 
Mit einem Color-Picker kannst du sehr bequem den Code für eine beliebige Farbe bestimmen - einfach indem du den Cursor drauf hältst: klick

marabu

AirJordan 7. Dez 2005 08:11

Re: Image aus ImageComboBox in ein BlobField abspeichern
 
Ok Marabu, ich werde den mal checken und dann ggf. die Struktur in der DB umstellen. Erstmal
danke für die Tipps. Werde, wenn das Projekt fertig ist, es hier mal einstellen. Auch wenn man
als Nicht-Diabetiker mit einigen Funktionen nichts anfangen kann, so hoffe ich doch das ich ein
paar Hinweise auf generelle Routinen bekommen kann. :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 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-2025 by Thomas Breitkreuz