2011-06-18 19 views
10

Hola Estoy usando GDI + para hacer algo de procesamiento de imágenes. Lo estoy ejecutando desde la línea de comando con dos argumentos. La razón de esto es que el programa se llama desde VBA Excel 2007. Se abre un diálogo de archivo abierto desde VBA y proporciona el primer argumento.Ruta del archivo desde una cámara usb

El primer argumento es la imagen original que debe procesarse y el segundo es dónde guardar la imagen. Todo funciona bien cuando los dos argumentos provienen de un disco con una letra, es decir, C :.

No funcionaba con las carpetas de red, es decir, \ server \ folder. Superé esto montando la carpeta en una letra de unidad antes de intentar cargar la imagen.

Tengo un problema ahora cuando la imagen entrante está en una cámara usb. La ruta del archivo del archivo en la cámara termina siendo COMPUTER \ Canon \ DCIM \ image.jpg. Windows no está montando la cámara en una unidad con letras por lo que no está funcionando correctamente para mí.

Antes de intentar cargar la imagen agrego un extra '\' para que todas sean dobles \.

No estoy seguro de cómo hacer que esto funcione y lo he examinado por completo. Gracias.

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; 
} 
+2

Creo que lo que tienes aquí es un dispositivo WIA que se muestra en el espacio de nombres del shell. Es decir. no hay ruta de archivo Debería poder adquirir la imagen usando WIA. Consulte http://msdn.microsoft.com/en-us/library/windows/desktop/ms630368(v=vs.85).aspx para obtener documentación. – Ben

Respuesta

0

que hay que buscar la forma en que la cáscara se ocupa de los caminos especiales, un buen comienzo es aquí: http://msdn.microsoft.com/en-us/library/bb773559%28v=vs.85%29.aspx

Para una gran parte de lo que está haciendo, usted debe utilizar PathCanonicalize() o algo a lo largo Estas líneas. No estoy seguro si esto te ayuda con tu cámara, es posible que necesites acceder a API de adquisición de imágenes directamente para sacar archivos de algunas cámaras.

1

favor, eche un vistazo a la muestra: GetImage Sample: Demonstrates the Windows Image Acquisition API:

La aplicación de ejemplo tiene un mando único en su menú Archivo, llamado Desde escáner o cámara. Cuando se conecta un dispositivo WIA (o un emulador de dispositivo) , el elemento del menú se habilita. Cuando el usuario selecciona el comando de menú , la muestra mostrará secuencialmente el cuadro de diálogo Selección del dispositivo WIA , el cuadro de diálogo Selección de imagen y el cuadro de diálogo Transferencia de imagen . Los cuadros de diálogo de selección de dispositivo y de imagen son los cuadros de diálogo comunes suministrados por el sistema, y ​​el cuadro de diálogo de transferencia es implementado en esta muestra. Finalmente, la muestra mostrará las imágenes transferidas en la (s) ventana (s) secundaria (s).

Espero que esto ayude.

Cuestiones relacionadas