Announcement

Collapse
No announcement yet.

Jpeg darstellung mit DBImage in DBCtrlGrid Komponente

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Jpeg darstellung mit DBImage in DBCtrlGrid Komponente

    Hallo,

    ich versuche schon seit länger ein Jepg bild was in einen Blobfeld gespeichert ist in einem DBImage darzustellen. Das DBImage ist in einem DBCtrlGrid abgelegt. Beim starten des Fenster erscheint die Meldung "Bitmap ist ungültig".

    Ich habe schon verschieden Lösung ausprobiert :
    -Jepg.hpp einbinden
    -An der Komponte (Graphics::TPicture* FPicture) -> (in ein passendes Format was Jepg unterstützt ändern)
    -Oder ein Neue Komponnte ich habe auch eine gefunden nur leider funktioniert die nett http://codecentral.borland.com/Item.aspx?id=19987

    könnte ihr mir vielleicht weiter helfen !

    Danke Schön im voraus

    Mfg SK-2
    Mfg SK-2

  • #2
    Wie ist denn die JPEG-Datei in die Datenbank gekommen. Kann Sie in anderen (existierenden Programmen) angezeigt werden. Sind es evtl. Jpegs mit spezieller Kodierung (Kontrolle mit IE oder Firefox)

    Comment


    • #3
      Also die Jepg datei habe ich selber in die Datenbank hochgeladen. Und das Format ist ganz normal halt ich kann zubeispiel mit einer TImage komponnte die datei anzeigen lassen. Leider kenn ich keine exestierenden programme die das können. Nur ich habe auch schon ätliche Komponnten gefunden die jepg unterstützen

      Mfg SK-2
      Mfg SK-2

      Comment


      • #4
        Dann ist doch erstmal der nächste Weg, aus der DB in das Filesystem zurückschreiben und prüfen, ob immer noch das Bild korrekt angezeigt wird.

        In was für ein Datentyp der DB wird das JPG geladen?
        Christian

        Comment


        • #5
          Hallo,

          sowas habe ich schon in meiner funktion "NeuesBildSpeichern" eingebaut.
          Das Datenbankbild und Originalbild im Filesystem wird durch MD5 kontrolliert.
          Ich habe einen neuen test gemacht, nämlich einfach eine Bmp in die datenbank geschrieben und siehe da DBImage kann dieses Bild wunderbar anzeigen. Nur leider 2.8 MB das ist mir halt einfach zugross, deshalb habe ich mich für jpeg entschieden. Also wie kann man jepeg files in eine DBImage darstellen oder muss ich eine andere Komponte installieren.

          Mit was Arbeite ich nur zur info :

          - C++ Borland 6 Prof
          - SQL Server 2005
          - ADO 2.8


          Mfg SK-2


          Bildupload-Funktion
          Code:
          bool TSQL::NeuesBildSpeichern(AnsiString Artikelnummer,AnsiString Dateiname){
          TADODataSet *ADOBS = new TADODataSet(this);
          
          if(Connected){
          try{
          // Bild Speichern
          ADOBS->Connection = ADOConnection1;
          ADOBS->LockType = ltOptimistic;
          ADOBS->CommandText = "select * from Bilder";
          ADOBS->Active = true;
          ADOBS->Insert();
          
          ADOBS->FieldByName("Artikelnummer")->AsString = Artikelnummer;
          TBlobField *b = (TBlobField *)ADOBS->Fields->Fields[2];
          b->LoadFromFile(Dateiname);
          
          ADOBS->Post();
          ADOBS->Active = false;
          }
          
          catch(const Exception &E){
          ShowMessage(String(String(E.ClassName())+" "+E.Message));
          ShowMessage(String(E.HelpContext));
          ADOConnection1->Errors->Clear();
          ADOBS->Active = false;
          delete ADOBS;
          return(false);
          }
          
          
          catch(...){
          ADOConnection1->Errors->Clear();
          ADOBS->Active = false;
          delete ADOBS;
          return(false);
          }
          //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
          
          try{
          
          ADOBS->LockType = ltReadOnly;
          ADOBS->CommandText = String("select * from Bilder where Artikelnummer = '"+Artikelnummer+"'");
          ADOBS->Active = true;
          TADOBlobStream *BSRead = new TADOBlobStream((TBlobField *)ADOBS->Fields->Fields[2], bmRead);
          BSRead->SaveToFile(Dateiname+".test1");
          ADOBS->Active = false;
          
           }
          
          catch(const Exception &E){
          ShowMessage(String(String(E.ClassName())+" "+E.Message));
          ShowMessage(String(E.HelpContext));
          ADOConnection1->Errors->Clear();
          ADOBS->Active = false;
          delete ADOBS;
          return(false);
          }
          
          catch(...){
          ADOConnection1->Errors->Clear();
          ADOBS->Active = false;
          delete ADOBS;
          return(false);
          }
          //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
          AnsiString Original;
          AnsiString Datenbank;
          
          Original = DateiGetMD5(Dateiname);
          Datenbank = DateiGetMD5(Dateiname+".test1");
          if(Original == Datenbank){
          DateiLoeschen(Dateiname+".test1");
          delete ADOBS;
          
          return(true);
          }
          else{
          return(false);
          }
          
          
          
          //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
          }
          else{
          Application->MessageBox("Es besteht keine Verbindung zu SQL-Server","Fehler",0+16);
          delete ADOBS;
          return(false);
          
          }
          };
          Mfg SK-2

          Comment


          • #6
            Dann der nächste Schritt, da ich irgendwie den Code für die Darstellung des Image oben nicht finden kann...

            Folgendes könnte das Problem sein:

            DBImage stellt eine Grafik dar. Grafiken sind immer Bitmaps, Icons, Cursors. Ein JPG ist keine Grafik. JPG ist ein Speicherformat einer Bitmap. Jede JPG-Datei muss eladen, dekompriniert werden. Dann können die Daten in ein Bitmap gewandelt werden.

            Somit, solltest du das BLOB-Feld direkt in das DBImage packen, die Daten aus dem BLOB-Feld erst in ein JPG-Objekt streamen und dann die daraus resultierende Bitmap anzeigen. Was dann ein DBImage überflüssig macht und ein normales Image genutzt werden kann.

            Also der Weg

            DB - JPGObjekt - TImage


            Der Weg

            DB - DBImage

            könnte aus o.a. Gründen fehlschlagen
            Christian

            Comment


            • #7
              Danke erstmal für die Schnell Antwort ,

              dein Vorschlag in allen ehren aber leider habe ich das schon versucht und brachte leider nicht das richtige ergebniss. Ich möchte mein Problem gern nochmal visuell darstellen, in der Form wo ich das Programmiere ist kaum code um das hier zu präsentieren.
              Attached Files
              Mfg SK-2

              Comment


              • #8
                dein Vorschlag in allen ehren aber leider habe ich das schon versucht und brachte leider nicht das richtige ergebniss.
                Das kann so nicht stimmen

                Wenn die JPG-Daten nach der Speicherung in die DB und nach einem Entladen aus der DB die Gleichen sind, dann muss zwangsläufig der von mir skizzierte Weg funktionieren.

                Wenn die Daten also beim Laden in die DB nicht (unabsichtlich) verändert werden, dann muss man sie als "Rohdaten" auslesen können, einem JPGObjekt übergeben können und dass muss dann die Grafik korrekt anzeigen

                EDIT

                nämlich einfach eine Bmp in die datenbank geschrieben und siehe da DBImage kann dieses Bild wunderbar anzeigen.
                Des Weiteren zeigt genau dieser Versuch, dass die Komponente eben keine JPG direkt darstellen kann.
                Zuletzt editiert von Christian Marquardt; 11.01.2008, 23:10.
                Christian

                Comment


                • #9
                  Also ich habe das mal jetzt ausprobiert, wenn auch mit einer MYSQL DB. Die DBImage Komponente kann kein JPG darstellen ->Fehlermeldung "Bitmap ist ungültig". Die sollte eigentlich bei dir auch kommen

                  Also ist die Lösung wie sie in Beitrag 6 beschrieben wurde.

                  Oder du suchst eine DBImage-Komponente die JPG darstellen kann

                  Oder du bearbeitest dein Bild entsprechend (verkleinern, Farbtiefe zurücknehmen)-> ich kann mir nicht vorstellen, dass es notwendig ist, ein derart großes BMP in die DB zu setzen um dann so ein relativ kleines Bild anzuzeigen wie in deinem Screenshot. Ohnehin ist die Ersparnis in der Größe (BMP=2,3 MB <-> JPG=??) nur in den Platz in der DB gegeben. Im Speicher ist das egal, da werden dann immer 2,3 MB benötigt (Auch wenn du das Bild in der Imagekomponente kleiner darstellen lässt)
                  Zuletzt editiert von Christian Marquardt; 12.01.2008, 07:55.
                  Christian

                  Comment


                  • #10
                    Hallo,

                    Sorry das mich solange nicht mehr gemeldet habe, also

                    ich habe dein Vorschlag im Beitrag 6 noch mal versuch zu realisieren. ich bin zu Schluss dazu gekommen das mir DBCtrlGrid nur wenig Möglichkeit bietet um mein Vorhaben zu realisieren.

                    Die Bildkomprimierung kommt auch nicht in frage weil ich eine Vorgabe habe in welcher Auflösung und maximalen Größe (300x300 und max. 20 kb).

                    Daher habe ich mich für die neue Komponente TAGDBImage die im ersten Beitrag schon gepostet habe entschieden, da diese auch weniger arbeit für mich bedeutet. Leider ist die Komponente in Delphi geschrieben aber ließ sich einwandfrei installieren .Ich fügt die Komponente in die DBCtrlGrid ein und sah auch so aus als wurde sie funktionieren weil sie schon mal das erste Bild was in der Datenbank gespeichert ist darstellte. Dann wollt ich ein exe erstellen und ging zum Menüpunkt wo die form erstellt wird dann tratt der fehler auf "Klasse TAGDBImage nicht gefunden" und nun weiß ich auch nett weiter kann mir da vielleicht einer weiter helfen weil ich mit meinen Latein bald am ende bin.
                    Mfg SK-2

                    Comment

                    Working...
                    X