2016-08-04 23 views
0

Hallo ich versuche, eine GUI für die Bildvergleichs-Software zu machen. Die Idee ist, ein Bild mit OPENFILENAME zu wählen, dann seine Adresse mit ofn.lpstrFile zu erhalten und dann ein Histogramm für dieses Bild zu erstellen. Also ich benutze:Wie speichere ich OFN.lpstrFile richtig?

return(ofn.lpstrFile); 

Ich kann die Adresse cout oder es in eine XML-Datei schreiben und die Adresse korrekt ist, aber wenn ich versuche, das Histogramm zu tun, es mir alle Nullen gibt. Benimmt sich wie die Adresse war ungültig.

Irgendwelche Ideen?

mein Code:

string path=browse(); //getting the string from ofn.lpstrFile 

    path.c_str(); 
    replace(path.begin(), path.end(), '\\', '/'); //converting backslash to slash also may be the problem  
    HistCreation(path,root_dir); 

und

void HistCreation(string path,string root_dir) { 

Mat img; 
img = imread(path); // here if i manually enter the address everything works fine, if I insert the path then loads empty image 

. 
. 
. 

Ich habe auch versucht

char * cstr = new char[path.length() + 1]; 
    std::strcpy(cstr, path.c_str()); 

Haben entweder nicht

arbeiten, um die Zeichenfolge
+2

Verwenden Sie 'std :: wstring' für die Rückgabe von Strings. Das Zurückgeben von Zeigern ist eine schlechte Idee, wenn Sie nicht wissen, was Sie tun. –

+0

Sie versuchen nicht, ein Histogramm des * Dateinamens * zu erstellen, oder? – molbdnilo

+0

Danke für die Antwort! @BarmakShemirani Ich habe versucht, {wstring path = ofn.lpstrFile}, aber es heißt: kein passender Konstruktor, um von LPSTR in String zu konvertieren, wchar, char, wchar_t können Sie bitte genauer? –

Antwort

0

std::string kehrt und das ist alles, was Sie ne ed. Dies ist ein Beispiel zum Öffnen einer Bitmap-Datei.

(Edit)

#include <iostream> 
#include <string> 
#include <windows.h> 

std::string browse(HWND hwnd) 
{ 
    std::string path(MAX_PATH, '\0'); 
    OPENFILENAME ofn = { sizeof(OPENFILENAME) }; 
    ofn.hwndOwner = hwnd; 
    ofn.lpstrFilter = 
     "Image files (*.jpg;*.png;*.bmp)\0*.jpg;*.png;*.bmp\0" 
     "All files\0*.*\0"; 
    ofn.lpstrFile = &path[0]; 
    ofn.nMaxFile = MAX_PATH; 
    ofn.Flags = OFN_FILEMUSTEXIST; 
    if (GetOpenFileName(&ofn)) 
    { 
     //string::size() is still MAX_PATH 
     //strlen is the actual string size (not including the null-terminator) 
     //update size: 
     path.resize(strlen(path.c_str())); 
    } 
    return path; 
} 

int main() 
{ 
    std::string path = browse(0); 
    int len = strlen(path.c_str()); 
    if (len) 
     std::cout << path.c_str() << "\n"; 
    return 0; 
} 

Hinweis, verwendet Windows-NUL beendet C-Strings. Er kennt die Länge der Zeichenfolge, indem er am Ende nach der Null sucht.

std::string::size() ist nicht immer das Gleiche. Wir können die Größenänderung aufrufen, um sicherzustellen, dass sie identisch sind.


Sie sollten nicht \\ mit / ersetzen müssen. Wenn Ihre Bibliothek beschwert sich über \\ dann wie folgt ersetzen:

Beispiel:

... 
#include <algorithm> 
... 
std::replace(path.begin(), path.end(), '\\', '/'); 

Verwenden std::cout untersuchen Sie die Ausgabe statt zu raten, ob es funktioniert oder nicht. Im Windows-Programm können Sie OutputDebugString oder MessageBox verwenden, um zu sehen, was die Zeichenfolge ist.

HistCreation(path, root_dir); 

Ich weiß nicht, was root_dir sein soll. Wenn HistCreation fehlschlägt oder den falschen Parameter hat, haben Sie ein anderes Problem.

+0

Super! @BarmakShemirani mit einigen Änderungen habe ich jetzt arbeiten. Vielen Dank, ich habe den ganzen Tag daran gearbeitet. Ich werde Ihren Beitrag auf das Formular bearbeiten, das ich jetzt habe, um die Antwort genauer zu machen. Netter Job Mann, danke! –

+0

Ich habe einige Ihrer vorgeschlagenen Bearbeitungen auskommentiert. 'path.erase (path.begin() + a, path.end());' tut nichts. Die Zeichenfolge ist in Ordnung, wie es ist. –

+0

seltsam .... wenn ich den Weg, den ich sehe etwas auszudrucken wie folgt aus: C: /path/dir/image.jpgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa. Deshalb habe ich diesen Earse verwendet. –

Verwandte Themen