Путь к файлу с USB-камеры

Здравствуйте, я использую GDI + для обработки некоторых изображений. Я запускаю его из командной строки с двумя аргументами. Причина этого заключается в том, что программа вызывается из VBA Excel 2007. Диалоговое окно "Открыть файл" запускается из VBA и дает первый аргумент.

Первый аргумент - это исходное изображение, которое нужно обработать, а второе - для сохранения изображения. Все работает отлично, когда два аргумента приходят с диска с буквой, т.е. C:.

Он не работал с сетевыми папками, то есть \server\folder. Я преодолел это, установив папку на букву диска, прежде чем пытаться загрузить изображение.

У меня проблема, когда входящее изображение находится на USB-камере. Путь к файлу файла в камере заканчивается как COMPUTER\Canon\DCIM\image.jpg. Windows не устанавливает камеру на буквенный диск, поэтому она не работает правильно для меня.

Прежде чем пытаться загрузить изображение, я добавляю и добавляю "\", чтобы все они были двойными.

Я совсем не уверен, как заставить это работать, и все посмотрело. Спасибо.

int main(int argc, char* argv[])
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR           gdiplusToken;

// INITIALIZE GDI+
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

wchar_t tin[200] = L"";
wchar_t in[200] = L"";
wchar_t out[200] = L"";
wchar_t tout[200] = L"";

NETRESOURCE nr;
DWORD dwRetVal;

nr.dwType = RESOURCETYPE_DISK;
nr.lpLocalName = "M:";
nr.lpRemoteName = "\\\\server\\folder";
nr.lpProvider = NULL;
// Map the mugshots folder
dwRetVal = WNetAddConnection2(&nr, NULL, NULL, CONNECT_TEMPORARY);

// Convert to a wchar_t* from command line argument
size_t origsize = strlen(argv[1]) + 1;
mbstowcs( tin, argv[1], origsize);

//Add an extra \ for directory
int j = 0;
for (int i = 0 ; i < int(origsize) ; i++)
{
    if(tin[i] == '\\')
    {
        in[j] = '\\';
        j++;
        in[j] = '\\';
        j++;
    }
    else
    {
        in[j] = tin[i];
        j++;
    }
}

// Convert to a wchar_t* from command line argument
origsize = strlen(argv[2]) + 1;
mbstowcs(tout, argv[2], origsize);
//Add an extra \ for directory

out[0] = 'M';
out[1] = ':';
out[2] = '\\';
out[3] = '\\';
j = 4;
for (int i = 0 ; i < int(origsize) ; i++)
{
    if(tout[i] == '\\')
    {
        out[j] = '\\';
        j++;
        out[j] = '\\';
        j++;
    }
    else
    {
        out[j] = tout[i];
        j++;
    }
}

Bitmap b(in);

Process image

CLSID pngClsid;
GetEncoderClsid(L"image/jpeg", &pngClsid);
image2->Save(out, &pngClsid, NULL);

return 0;
}

Ответ 1

Пожалуйста, взгляните на образец: Пример GetImage: демонстрирует API захвата изображений Windows:

Образец приложения имеет одну команду в меню "Файл", названную Из сканера или камеры. Когда устройство WIA (или эмулятор устройства) При нажатии кнопки пункт меню становится активным. Когда пользователь выбирает команды меню, образец будет последовательно отображать устройство WIA Диалоговое окно выбора, диалоговое окно "Выбор изображения" и "Передача изображений" диалоговое окно. Диалоговые окна выбора устройства и изображения являются общими диалоговые окна, поставляемые системой, а диалоговое окно передачи - реализованной в этом образце. Наконец, образец отобразит переданное изображение в дочерних окнах.

Надеюсь, что это поможет.

Ответ 2

Вам нужно посмотреть, как оболочка обрабатывает специальные пути, хорошее начало здесь: http://msdn.microsoft.com/en-us/library/bb773559%28v=vs.85%29.aspx

Для многого, что вы делаете, вы должны использовать PathCanonicalize() или что-то в этом роде. Не уверен, что если это поможет вам с вашей камерой, вам может потребоваться получить доступ к API-интерфейсам для получения изображений непосредственно, чтобы получить файлы из некоторых камер.