Bilder automatisch laden und mit MD5 Checksumme aus Datenbank vergleichen
-
Hallo @ll,
ich habe jetzt wieder ein neues (größeres Projekt) in Arbeit und hänge mal wieder an einem Punkt.
Projekt: Ich lese Bilder aus einem anderen Programm aus, (Screenshot aus der FAQ). Möchte die MD5 Checksumme dieses Bildes in einer Tabelle speichern und einen Kommentar dazu schreiben.
So dass nachher in der Tabelle steht:
dateiname - MD5 String - Kommentar
Jetzt habe ich folgendes Problem: Ich lade das erste Bild, erstelle die Checksumme, schreibe einen Kommentar und will danach das nächste Bild laden. Das nächste Bild wird zwar geladen, allerdings ist der MD5 Sring immer der gleiche.AnsiString TForm1::GetMD5String(AnsiString Bild) { // set up dialog // OpenDlg->InitialDir = GetCurrentDir(); // clear output area // Hash->Text = ""; // if( OpenDlg->Execute() ) { // open file, binary mode std::ifstream file(Bild.c_str(), std::ios::binary ); // reset coder MD5->Reset(); char* buffer = new char[ 4096 ]; do { // attempt to read 4k from file file.read( buffer, 4096 ); // code however much was read MD5->CodeString( String( buffer, file.gcount() ) ); } while( file.gcount() == 4096 ); delete[] buffer; // finished with buffer // done, get result String result = MD5->CompletedInput(); // trim off leading numeric int n = result.Pos(";"); result = result.SubString(n+1,result.Length()-n); // dump output into string stream as hex // this is just to make it human readible std::ostringstream hexStr; hexStr << std::hex << std::setfill('0'); for( int i = 1 ; i <= result.Length() ; ++i ) hexStr << std::setw(2) << ( ( (unsigned) result[i] ) & 0xff ) << ' '; // show hex string in edit control return hexStr.str().c_str(); }
Dies ist die Funktion zum erzeugen des MD5 STrings.
void __fastcall TForm1::BitBtn4Click(TObject *Sender) { AnsiString Name="", MD5=""; Name=this->FileList->Strings[zaehler].Trim(); MD5=""; this->Edit2->Text=Name; this->Image1->Picture->LoadFromFile("d:\\Bilder\\"+this->Edit2->Text.Trim()); //laden des Bildes in Picture this->StringGrid1->Cells[0][zaehler+1]=this->Edit2->Text.Trim(); MD5=GetMD5String(this->FileList->Strings[zaehler].Trim()); <=== FEHLER IM AUFRUF DER FUNKTION, es wird keine Datei sonder nur ein String übergeben this->StringGrid1->Cells[1][zaehler+1]=MD5; this->StringGrid1->Cells[2][zaehler+1]=this->ELastBildName->Text.Trim(); this->ELastBildName->Clear(); zaehler++; }
Mit dieser Funktion rufe ich die Checksummenfunktion auf. Allerdings ist die Checksumme bei allen Bildern gleich. Woran liegt das ??
Wahrscheinlich stehe ich mal wieder auf dem Schlauch, aber ich habe derzeit keine Ahnung was ich mal wieder übersehe.
FGGF
-
Was ist "zaehler"? Wo kommts her, wozu isses gut?
-junix
-
Sorry. Hab vergessen zu erwähnen, dass ich die Bilddateien aus einer Directory einlese, diese in eine ListBox speichere. Dieser Dateinamen wird dann mit Hilfe Item[zaehler] ausgelesen und die Bilddatei geöffnet. Zaeler ist praktisch ein Integerwert um die Items in der Listbox anzusprechen. Global deklariert.
FGGF
-
Hast du in GetMD5 mal geprüft, ob tatsächlich jeweils der erwartete Dateiname übergeben wird?
Und ist es möglich, dass die ersten 4KB der Bilder identisch sind?
-
Wieso global?
hast du schonmal mit dem Debugger durch dein Programm gesteppt und den logischen Ablauf überprüft?
-junix
-
Ja hab ich, er durchläuft alles ohne probleme. Wie gewünscht, nur das der Rückgabestring immer derselbe ist.
Vielleicht sollte ich auch eine ander Frage stellen:
Wie benutze ich den MD5 Coder um die Prüfsumme einer Datei zu erstellen ?
FGGF
-
Welcher "MD5 Coder"? Sollen wir jetzt raten, ob du den aus dem Indy-Paket meinst?
Und was hältst du von der Suchfunktion?
http://www.c-plusplus.net/forum/viewtopic.php?t=43887&highlight=md5
-
Der Code den ich oben gepostet habe stammt aus diesem Thread, den du mir gezeigt hast, er funktioniert auch. Allerdings nicht mehr bei de 2. Datei, da wird der gleiche String zurückgegeben wie beid er ersten Datei und ich verstehe nicht warum. Dies ist der eigentliche Grund für meine Post.
FGGF
-
Wo wird "zaehler" in/dekrementiert? Geschieht dies? Welche Datei wird denn schlussendlich geöffnet um die Checksumme zu bilden? Beantworte diese Fragen mal mit dem Debugger....
-junix
-
Zaehler wird nach dem Klick auf den Button inkrementiert. Das nächste Bild wird auch richtig geladen. siehe Code oben. Nur der MD5 String bleibt gleich.
Zaehler wird richtig hochgezählt (mit Debugger und Edit-Ausgabe getestet).Ich vermute das die Datei bei der Funktion GetMD5String()
nicht neu geladen wird. Warum weiss ich nicht. ODer ich sehe es zumindest nicht. Tut mir leid.FGGF
Edit1: Ich habe jetzt noch etwas herausgefunden, es wird immer der gleiche String erzeugt. Egal was für Bilder geöffnet werden. Also auch wenn ich die Bilder in der Directory die ausgelesen wird komplett getauscht werden.
-
Okay, ich gebs zu ich bin ne hohle Nuss. Hab den Fehler gefunden.
Der Aufruf der Funktion GetMD5String war falsch.MD5=GetMD5String("d:\\Bilder\\"+this->Edit2->Text.Trim());
Ich muss den Pfad auch mit übergeben. Sonst können keine Bilder geöffnet werden. Und das vom String Bild immer der gleiche MD5 String erzeugt wird ist klar.
Aber thx für die Anregungen, hat mir geholfen.
FGGF
-
Erinnerst du dich?
junix, 17 Nov 2003 13:39 schrieb:
[...]Welche Datei wird denn schlussendlich geöffnet um die Checksumme zu bilden?[...]
Mein verdacht war also doch richtig... schön, dass mein Riecher noch nicht ganz kaputt gegangen ist (o;
-junix
-
Hey, da habe ich aber zuerst drauf hingewiesen, und das trotz Schnupfen!
-
Jaja, Jansen is ja schon gut, du bist schneller *hustenbonbonreich* (o; (o;
-junix