Как сохранить ofn.lpstrFile в строку правильно?

Привет я пытаюсь сделать графический интерфейс для программного обеспечения для сравнения изображений. Идея состоит в том, чтобы выбрать изображение с OPENFILENAME, затем получить его адрес с помощью ofn.lpstrFile, а затем создать гистограмму для этого изображения. Так что я использую:

return(ofn.lpstrFile);

Я могу записать адрес или записать его в XML-файл, и адрес правильный, но когда я пытаюсь сделать гистограмму, это дает мне все нули. Ведет себя как адрес был недействительным.

Есть идеи ?

мой код:

    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);

а также

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

.
.
.

Я тоже пробовал

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

Тоже не сработало

0

Решение

std::string возвращает строку, и это все, что вам нужно. Это пример, чтобы открыть файл растрового изображения.

(Редактировать)

#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;
}

Обратите внимание, что Windows использует C-строки с NUL-символами. Он знает длину строки, ища ноль в конце.

std::string::size() это не всегда одно и то же. Мы можем вызвать изменение размера, чтобы убедиться, что это одно и то же.


Вам не нужно заменять \\ с /, Если ваша библиотека жалуется на \\ затем заменить следующим образом:

Пример:

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

использование std::cout проверить вывод вместо того, чтобы угадать, сработало оно или нет. В программе Windows вы можете использовать OutputDebugString или же MessageBox чтобы увидеть, что это за строка.

HistCreation(path, root_dir);

Я не знаю что root_dir должен быть. Если HistCreation не удается или имеет неправильный параметр, то у вас есть другая проблема.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]