AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi PNG-Bild aus BLOB-Feld in Image laden
Thema durchsuchen
Ansicht
Themen-Optionen

PNG-Bild aus BLOB-Feld in Image laden

Ein Thema von scrat1979 · begonnen am 20. Dez 2010 · letzter Beitrag vom 15. Nov 2020
Antwort Antwort
Seite 1 von 2  1 2      
Laaeris

Registriert seit: 10. Dez 2011
24 Beiträge
 
#1

AW: PNG-Bild aus BLOB-Feld in Image laden

  Alt 2. Sep 2020, 10:14
Du musst das PNG erst in eine temporäre Instanz der PNG-Imagekomponente laden. TPicture kann nur beim laden aus einer Datei über die Dateiextension das Grafikformat erkennen. Beim Stream als Stream müsste hier noch der Klassenname der entsprechenden Grafikkomponente am Anfangen stehen. Einfach mal ein PNG mit der IDE zuweisen und dann die DFM anschauen. Dort steht etwas in der Art: "TPNGImage" vor den eigentlichen PNG-Stream.
UPDATE: Funktioniert perfekt! Hatte damals vergessen, die Unit "PNGImage" einzubinden!! Danke!
Ich habe sicher nicht genug Erfahrung, jedenfalls verstehe ich nicht, wie Dein endgültiger Ladecode nun aussieht. Kannst Du ihn vielleicht einmal posten?
Speicherst Du PNG auch im Blobfeld und ist der Code, wenn ja, "äquivalent"?

Liebe Grüße,

David
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd
Online

Registriert seit: 17. Feb 2005
Ort: Weitingen
685 Beiträge
 
Delphi 12 Athens
 
#2

AW: PNG-Bild aus BLOB-Feld in Image laden

  Alt 3. Sep 2020, 08:31
Delphi-Quellcode:
var png: TPngImage;

...
  png := TPngImage.Create;
  png.LoadFromStream(BlobStream);
  Picture.Graphic.Assign(png);
...
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.534 Beiträge
 
Delphi 12 Athens
 
#3

AW: PNG-Bild aus BLOB-Feld in Image laden

  Alt 3. Sep 2020, 09:48
Alte Delphis schauten immer nur auf die Dateiendung, also nur im Picture.LoadFromFile,
aber seit einer Weile ist im Picture.LoadFromStream ein Code drin, der auf die MagicBytes (FileHeader) guckt.

Drum geht es jetzt auch direkt mit Image.Picture.LoadFromStream(BlobStream); ,
ohne dass man vorher selber im Image.Picture.Graphic den "richtigen" Typ bereitstellen muss.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Laaeris

Registriert seit: 10. Dez 2011
24 Beiträge
 
#4

AW: PNG-Bild aus BLOB-Feld in Image laden

  Alt 9. Sep 2020, 13:35
...erstmal supervielen Dank für die fixen Antworten. Ich vermute das Laden funktioniert nun, aber ich bekomme einen CRC-Fehler beim Laden, also vermute ich ich mache das Speichern komplett falsch. Ich habe dazu keinen Codeschnipsel gefunden, aber vielleicht drückt mal jemand meine Nase (ruhig doll drücken) auf einen Thread mit einem einfachen Code?

Laden:
Delphi-Quellcode:
var
  PNG_Bild : TPNGImage;
  BildLadenQuery : TMyQuery;
  BlobStream : TStream;
begin (*of Button_WappenbildvonDBinImageClick*)
  PNG_Bild:=TPNGImage.Create;
  BildLadenQuery:=TMyQuery.Create(BBM_Datamodule);
  try
    BildLadenQuery.Connection:=BBM_Datamodule.BMMConn;
    BildLadenQuery.SQL.Text := 'Select Wappenbild from BBM_Verein where idVerein=:ID';
    BildLadenQuery.Params[0].Value := Aktiv_Verein_ID;
    BildLadenQuery.ExecSQL;

    BlobStream := BildLadenQuery.CreateBlobStream(BildLadenQuery.FieldByName('Wappenbild'),bmRead);
    PNG_Bild.LoadFromStream(BlobStream);
    Image_Wappen1.Picture.Assign(PNG_Bild);
  finally
    PNG_Bild.Free;
    BildLadenQuery.Free;
  end; (*of finally*)
Speichern:
Delphi-Quellcode:
var
  PictureFile : TFileName;
  PNG_Bild : TPNGImage;
  BildSpeicherQuery : TMyQuery;
  BlobStream : TStream;
begin
  PNG_Bild:=TPNGImage.Create;
  BildSpeicherQuery:=TMyQuery.Create(BBM_Datamodule);
  try
    OpenDialog_NamenHauptform.Execute;
    FileExists(OpenDialog_NamenHauptform.FileName);
    PNG_Bild.LoadFromFile(OpenDialog_NamenHauptform.FileName);

    BildSpeicherQuery.Connection:=BBM_Datamodule.BMMConn;
    BildSpeicherQuery.SQL.Text := 'Update BBM_Verein set Wappenbild=:BILD Where idVerein=:ID';
    BildSpeicherQuery.Params[0].Assign(PNG_Bild);
    BildSpeicherQuery.Params[1].Value := Aktiv_Verein_ID;
    //BildSpeicherQuery.Parameters[1].Assign(itPNG);
    BildSpeicherQuery.ExecSQL;

  finally
    PNG_Bild.Free;
    BildSpeicherQuery.Free;
  end; (*of finally*)
EDIT: Habe gerade mit der Workbench das PNG-File direkt in die DB geladen. Ob man das so naiv machen kann weiss ich nicht. Effekt: BLOB-Byteanzeige ist bei 147 KB (das passt), ladbar ist es nicht (CRC-Fehler wie zuvor).

Liebe Grüße,

David
Angehängte Grafiken
Dateityp: jpg CRC_PNG_Fehler.JPG (23,2 KB, 10x aufgerufen)
Dateityp: jpg Bild.JPG (144,0 KB, 15x aufgerufen)

Geändert von Laaeris ( 9. Sep 2020 um 13:41 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: PNG-Bild aus BLOB-Feld in Image laden

  Alt 9. Sep 2020, 13:43
.. ist die Blob-Größe Deiner Datenbank auf 64kByte begrenzt?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: PNG-Bild aus BLOB-Feld in Image laden

  Alt 9. Sep 2020, 13:49
Hier "delphi-load-image-save-as-blob-in-a-sql-database" werden mehrere möglichkeiten angesprochen, vielleicht ist ja auch eine für dich dabei.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Laaeris

Registriert seit: 10. Dez 2011
24 Beiträge
 
#7

AW: PNG-Bild aus BLOB-Feld in Image laden

  Alt 13. Sep 2020, 12:16
.. ist die Blob-Größe Deiner Datenbank auf 64kByte begrenzt?

Grüße
Klaus
Nein, siehe "Direktladetest", da gibt es keine Begrenzung.

Liebe Grüße,

David
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.361 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: PNG-Bild aus BLOB-Feld in Image laden

  Alt 13. Sep 2020, 12:25
Ich kenne AbsoluteDatabase und die Komponenten nicht.
Aber du benutzt beil Laden für ein Select ExecSQL.

Das könnte Probleme bereiten.
Ändert sich was, wenn du statt BildLadenQuery.ExecSQL BildLadenQuery.Open verwendest?

[EDIT]
Man kann beim Laden einfach mal den Inhalt des Blobfeldes auf Platte scheiben:
TBlobField(BildLadenQuery.FieldByName('Wappenbild' )).SaveToFile('x.png') und vergleichen...
[/EDIT]


Frank
Frank Reim

Geändert von dataspider (13. Sep 2020 um 12:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.361 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: PNG-Bild aus BLOB-Feld in Image laden

  Alt 13. Sep 2020, 13:17

Speichern:
  BildSpeicherQuery.Params[0].Assign(PNG_Bild);
Ich glaube nicht, dass das funktioniert.
Ich würde das in etwa so machen:

Delphi-Quellcode:
procedure BildLaden;
var
  BildSpeicherQuery: TMyQuery;
  ImageStream: TMemoryStream;
begin
  if OpenDialog_NamenHauptform.Execute then
  begin
    ImageStream := TMemoryStream.Create;
    try
      BildSpeicherQuery := TMyQuery.Create(BBM_Datamodule);
      try
        BildSpeicherQuery.Connection := BBM_Datamodule.BMMConn;
        BildSpeicherQuery.SQL.Text := 'Update BBM_Verein set Wappenbild=:BILD Where idVerein=:ID';

        ImageStream.LoadFromFile(OpenDialog_NamenHauptform.FileName);
        ImageStream.Position := 0; // vorsichtshalber
        BildSpeicherQuery.Params[0].SetBlobData(ImageStream.Memory, ImageStream.Size);
        BildSpeicherQuery.Params[1].Value := Aktiv_Verein_ID;
        BildSpeicherQuery.ExecSQL;
      finally
        BildSpeicherQuery.Free;
      end;
    finally
      ImageStream.Free;
    end;
  end;
end;
Frank Reim
  Mit Zitat antworten Zitat
Laaeris

Registriert seit: 10. Dez 2011
24 Beiträge
 
#10

AW: PNG-Bild aus BLOB-Feld in Image laden

  Alt 8. Nov 2020, 18:14
[QUOTE=dataspider;1473505]
Ich glaube nicht, dass das funktioniert.
Ich würde das in etwa so machen:
...
Hey Frank,

die Prozedure läuft fehlerfrei durch - topp. Ich kann noch nicht laden (immer noch PNG-CRC Fehler wie oben), aber ich habe in der Datenbank auf das Feld geschaut, es hat die Größe 65535 Byte. Solche Zahlen machen mich dann nervös, und laut MYSQL-Workbench sieht das Bild wie angehängt aus - irgendwie halb. Immerhin erkennt zumindest die DB das ganze als Image.

Was glaubst Du, woran das liegt?

Liebe Grüße,
David

P.S. (nachedit): Bin gerne bereit dass in diesen verrückten Coronazeiten mal 5 Minuten als Websession zu lösen und die Lösung dann hier zu posten.
Angehängte Grafiken
Dateityp: jpg BildinDB.JPG (33,5 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 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