Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Fran1946

#41
Bueno, pues ya está terminado el programa, funciona muy bien.

Si queréis ver la última versión con visor propio, y funciones que facilitan poder comparar los originales con los convertidos, de forma muy cómoda y fácil.

Este es el link del vídeo nuevo:

https://www.youtube.com/watch?v=BkmX5sx_bGw

Y este es el link de descarga del programa, para quien lo necesite, solo hay que descomprimir el rar en C;\, no tiene instalación:

https://dl.dropboxusercontent.com/u/51073224/FOTOS%20JPG.rar

Un saludo, y gracias a todos por vuestra ayuda.

#42
Gracias pkj:

Si es buena idea, había hecho un visor con 2 PictureBox, uno al lado del otro, y que el de la izquierda, al mover la imagen con el mouse, el otro movía la suya de la misma forma, pero el movimiento es lento.

Pero voy a probar tu idea, pero con imágenes muy grandes como las de mi cámara de 5184x3456, no se ve entera en un monitor de 20-22", con autosize=true, y si no la imagen solo ves una parte superior arriba.

Pero voy a probar con un control Image, con Stretch=true, a ver si la carga es rápida.

Un saludo.
#43
Hola okik:

Buena sugerencia, esto ya lo había pensado para otros, no para mí que ya lo he comprobado con mas de 2000 fotos pasando de 2.34 Gb a 1.4 Gb

de espacio, ya que después de comprobar que son iguales lo normal es borrar la carpeta 'BackPaint' donde están lo originales, por que el

programa si no puede salvar 'convertir' un archivo lo deja como original, y lo apunta en el archivo 'Informe convertidos.txt' como  0.0% menos.

Esto es el contenido de ''Informe convertidos.txt' de la conversión se solo 2 fotos:

Fecha: 18/05/2015    Hora: 19:00:16

1 - T:\DATOS\Camara\Cumple Susi y Germán 2015\_MG_2237.JPG -  (Antes) 5597,5 Kb / (Despues) 822,5 Kb - 85,3 % menos
2 - T:\DATOS\Camara\Cumple Susi y Germán 2015\_MG_2239.JPG -  (Antes) 9107,1 Kb / (Despues) 1475,4 Kb - 83,8 % menos

2 Archivos originales copiados en: T:\DATOS\Camara\Cumple Susi y Germán 2015\BackPaint\, Total: 14.704,6 Kb

-------------------------------------------------------------------------------------------------

2 Archivos convertidos en: T:\DATOS\Camara\Cumple Susi y Germán 2015\, Total: 2.297,9 Kb
Total: 12.406,7 Kb menos, promedio de ahorro total: 84,4 % menos
-------------------------------------------------------------------------------------------------
Pero lo ideal sería poder cargar el original y el convertido, sin cambiar el Caption del visor, ya que el programa indica cual estas viendo, pero de la forma como carga los archivos de 'SDPaint' en el mismo visor, no abriendo otro nuevo, por que de esta forma no hay un parpadeo entre una imagen y la otra como ocurre ahora, y eso destruye el poder ver la misma imagen antes y después, sin parpadeo, o sea como se ve si hubiera en la misma carpeta, por ejemplo, 2 imágenes:
Imagen_1 e Imagen_1A, y selecciones en el explorer las 2 y con botón derecho en una de ellas eliges en el menú emergente 'Vista previa' y entonces con cualquier tecla de flecha del teclado, pasas de una otra sin parpadeo y entonces si ves claramente que no distingues cual es cual.
Y eso no se si se puede conseguir utilizando el código del usuario del otro foro, por que he probado teniendo una imagen cargada en el visor de Win y arrastro otra desde el Explorer, y la carga pero con parpadeo.

Dime si conoces algún visor gratuito, muy simple, para poder probar con el código que utilizo con 'SDPaint'.

Gracias de nuevo por tu interés.

Si quieres, tu u otras personas, descarga el programa aquí, y lo pruebas:

https://dl.dropboxusercontent.com/u/51073224/FOTOS%20JPG.rar

Un saludo.

#44
Gracias okik:

Código (vb) [Seleccionar]
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long

Si así lo he echo yo con 'SetWindowTextA'

Tan sólo necesitas obtener el Handle de la ventana, en este caso del visor de imágenes de Windows. El Handle, como ya sabes puedes obtenerlo con
FindWindow y necesitas el nombre de clase de la ventana que es "Photo_Lightweight_Viewer" y "ShlmgVw:CPreviewWnd" en XP, o bien el mismo título de la ventana.

Luego el código podría ser:

Código (vb) [Seleccionar]
Dim hwndViewer As Long
Do While hwndViewer = 0
hwndViewer = FindWindow("Photo_Lightweight_Viewer", vbNullString)
DoEvents
Loop
Call SetWindowText(hwndViewer, "Imagen 1 - Convertido")


Esto no funciona, no obtiene el handle, siempre  = 0, ya te dije que esta función falla mucho.

Pero yo si consigo el handle siempre, con un módulo de clase que tengo se llama 'clsEnum.cls'

Y me funciona y cambia el captión, como he comentado, pero solo desde VB6, poniendo una interrupción, pero si la quito, entonces la cambia un instante y vuelva a ponerse:  ' - Visor de imágenes y fax de Windows' 

Subo 2 capturas para que lo veas:


imagen


subir fotos a internet

Un saludo.
#45
Hola a todos:

Ya termine la aplicación, y funciona muy bien, gracias a la ayuda de okik y a la de otro usuario de otro foro.

Para quien quiera ver como funciona, este es el link del vídeo que he hecho:

https://www.youtube.com/watch?v=kr35DvIztYU

Solo me queda una pregunta para okik:

Si has visto el vídeo, veras que después de haber salvado los archivos, tiene una opción de ver y comparar el original y el convertido en el visor de imágenes y fax de windows.
Pues yo quería que al visualizar las imágenes en el visor de Win, a continuación del nombre del archivo, se viera ' - Original' o ' - Convertido', en lugar de:
- Visor de imágenes y fax de Windows
Y esto ya lo tenía conseguido y cambiaba el Caption del visor de Win poniendo una interrupción después de la linea del código que manda el mensaje, pero si quito la interrupción, lo manda y se ve un instante, pero a continuación vuelve a verse ' - Visor de imágenes y fax de Windows'  

No se si esto se puede evitar, y conseguir que se vea, por ejemplo
En lugar de:
Imagen 1 - Visor de imágenes y fax de Windows
Se vea:    
'Imagen 1 - Convertido', o 'Imagen 1 - Original'

Gracias y un saludo.



#46
Lo he visto por encima, y efectivamente es un código muy complicado, pero siempre es bueno tener códigos como este para poder utilizarlo en una aplicación, sin tener que utilizar OCX para exportar a JPG.
Lo voy a mirar con mas detalle a ver si me vale para salvar un PictureBox de una aplicación que tengo, que grafica varios planos mecánicos por código.

Pero lo he ejecutado cargando un BMP y salvado a JPG con calidad 100% y 1:1, y luego el mismo BMP cargado con Paint de XP, y salvado a JPG y tiene 60% menos de peso que el salvado con este código.
Me gustaría saber que algoritmo de compresión JPG tiene Paint, que salva los JPG con el peso mas bajo posible, me parece increíble, por que el formato JPG no lo desarrolló Microsoft, y no entiendo como mejora la compresión en un porcentaje enorme respecto al original. 
#47
Hola de nuevo okik:

Me encanta este código, lo he probado y me ha dado todos los wParam de los menues de Paint, solo he hecho un For-Next de 30 y me han sobrado.
Esto me va a servir de mucha ayuda para muchas cosas.

Sobre esto:
Call StartMSPaint("C:\Directorio\mspaint.exe", strFile, MS_SAVE)

Así ya lo utilizaba en tu código, pero la desventaja es que cada archivo del ListBox que mando, carga un nuevo 'SDPaint', y eso lo quería evitar, quiero cargar solo en el primer archivo 'SDPaint' y luego mandarle los siguientes al mismo 'SDPaint' sin cerrar lo, pero en tu código no se si esto es posible, al menos yo no se donde hay que modificarlo.

El código para hacer esto, que me lo dado un usuario del foro de canalvisualbasic.net  que precisamente publico este post:

http://www.canalvisualbasic.net/foro/visual-basic-6-0/aporte-arrastrar-ficheros-sobre-una-ventana-21333/#post66767

Y con este código si se hace lo que quiero, pero no se podía salvar con SendKeys, por que lo que hace es Drag&Drop de los archivos a  un solo 'SDPaint' abierto, pero en memoria RAM.
Este código a mi me ha sorprendido, por que abarca todas las posibilidades, aunque yo solo utilizo una y ademas siempre consigue el hwnd de 'SDPaint', por que con:
hwnd = FindWindow("SDPaintApp", vbNullString)

Falla mucho, y no siempre consigue el hwnd a la primera.

Y gracias a ti y a el, tengo lo necesario para lo que necesito.

Por cierto la imagen que adjuntas en el proyecto 'Dock.jpg' que pesa 309 Kb, con  'SDPaint', la reduce a 72.4 Kb un 76.6 % menos, aseguro que son exactamente iguales en resolución y calidad, pero no solo con JPG's de 72 ppp hace lo mismo con JPG's de 300 ppp, no me explico como Paint de XP consigue esto, que no se consigue con ningún otro programa, Photoshop hace justo lo contrario, aumenta el peso.

Te reitero una vez mas las gracias por tu ayuda.

Y si a ti o a alguien le interesa tener esta aplicación que lo diga en este post y yo publico o el link para descargar el ejecutable (60 Kb), o el código del proyecto.

Voy a hacer un vídeo para que se vea como utilizarlo, y lo subo aquí.

Un saludo.
#48
Hola okik:

Te agradezco mucho tu respuesta, y además con un código completo de programa.

Lo he probado y funciona perfectamente, pero no me soluciona el problema te explico:

Este programa llama al mspaint de windows, en su ruta original de 'System32', por lo tanto si yo ejecuto este programa en Win 7, ejecutara y cargará los archivos JPG en el maspaint de win 7, y este al salvar no disminuye nada el peso de los archivos JPG, que es el objeto de la aplicación.

Y el código que yo tengo en mi aplicación, ejecuta una copia de mspaint.exe de Win XP, que yo he renombrado como 'SDPaint.exe' que estaría en la ruta donde este el ejecutable de mi aplicación.
Por lo tanto si se ejecuta en Win 7, utiliza 'SDPaint.exe' , o sea la copia renombrada de mspaint de win XP, y no el mspaint de Win 7, y entonces si disminuye el peso de los archivos JPG.

Pero además he modificado la copia 'SDPaint.exe' con el editor hexadecimal WinHex, de forma que donde figura como 'MSPaintApp' ahora es 'SDPaintApp'.

Entonces en esta parte de tu código:

'Obtiene el handle de MSPaint que ha abierto el archivo
    Do While hwMsPaint = 0
        Count = Count + 1
        hwMsPaint = FindWindow("MSPaintApp", sFile & " - Paint")
        DoEvents
        If Count > 50000 Then Exit Function
    Loop

  Entonces esta linea:
hwMsPaint = FindWindow("MSPaintApp", sFile & " - Paint")

debería ser:
hwMsPaint = FindWindow("SDPaintApp", sFile & " - Paint")

Pero no comprendo como trabaja esta parte de código que supongo carga mspaint:

Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objStartup = objWMIService.Get("Win32_ProcessStartup")
    Set objConfig = objStartup.SpawnInstance_
    objConfig.ShowWindow = 12 'Iniciar en modo oculto (usar 1 para modo visible)
    Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process")

    sDir = GetDirCorto(strPathFile) 'Obtiene el directorio corto Ej.: "[Drive]:\Name~1.jpg"


Y no se si se puede modificar para que cargue 'SDPaint.exe' , o sea la copia renombrada de mspaint de win XP.

Si esto fuera posible, entonces si me valdría.

Pero lo que si ha sido definitivo para que el código de mi proyecto, que si utiliza 'SDPaint.exe' , o sea la copia renombrada de mspaint de win XP, pueda salvar sin utilizar SendKeys, es esta linea de tu código:

X& = SendMessage(hwMsPaint, WM_COMMAND, 57603, &H0) 'Guardar

Y por favor me puedes decir donde has conseguido saber que el parámetro 57603 es 'Guardar' y el 57604 es 'Guardar como', por que esto lo he buscado durante días en Internet y no he conseguido nada, y tengo un listado completo de constantes para SendMessage, y estos 2 parámetros no aparecen, este es el link:

http://www.vbcode.com/asp/showsn.asp?theID=11797

No se si me puedes responder a estas dudas, pero te doy las gracias de todas formas por tu ayuda.

Un saludo.
#49
ShellExecute 0, "open", "c:\windows\system32\mspaint.exe", "c:\imagen.jpg", "", 1

Claro, si llamas al msPaint y la imagen esta en C:\ si funciona, pero si la imagen esta en, por ejemplo, "T:\A\Nueva carpeta\imagen.jpg", entonces no funciona.

Pero creo que no has entendido mi pregunta:

Yo no tengo problema para abrir las imágenes en cualquier ruta y HD, con una copia de 'mspaint.exe', renombrada por mi como 'SDPaint.exe' ubicada en otra ruta diferente a "c:\windows\system32".

En Win XP, mi aplicación funciona 100%, utilizando "c:\windows\system32\mspaint.exe" , donde no funciona es en Win7, por que el mspaint de Win7 es diferente al de Win XP, digamos que es menos básico y tiene mas herramientas, pero al salvar las imágenes no las reduce de peso nada, que es el objetivo de mi aplicación.

Ya he conseguido también ajecutar 'SDPaint' al principio sin ninguna imagen, y luego cargar una a una todas la imágenes con sus rutas completas de la lista de un ListBox, lo único que no he conseguido es mandarle el comando Ctr+g, que es lo que salva la imagen cargada en 'SDPaint', por que haciendolo con:
SendKeys "^{g}", 3
No funciona, y creo que la única forma es hacerlo con SendMessage o con PostMessage, pero hay me pierdo.
#50
Gracias por tu interés, pero creo que no entiendo tu respuesta:

"c:\sdpaint.exe c:\imagen.jpg"
Eso no es código ejecutable, y si te refieres a:

Call Shell("c:\sdpaint.exe c:\imagen.jpg",1) eso tampoco es ejecutable.