seleccionar area en una imagen
seleccionar area en una imagen
lo paso para aca porquelo meti en laseccion que no era
Amigos buen dia
les escribo por lo sgte :
estoy adaptando un script que :
1 cargará una imagen
2 despues con un boton se selecionara un area de la imagen por ejemplo de 500 x 300
3 otro boton guardará el area selcionada con un nuevo nombre, la cual siempre tendra el mismo tamaño 500 x300
pero tengo un detalle necesito saber con cual comando puedo hacer el paso numero 2 ya que por lo que he buscado no lo he visto , para que se hagan una idea es muy parecido a cuando en el facebook se seleciona el area de una imagen paraque solo esa parte se vea en el perfil
despues les preguntre algo sobre coordenadas, ya que como lo hago ahora es arrastrando el muouse y creando el cuador a recortar epro seme sale de laimagen ym e tomaparte del aaplicacion , digo despues porque con lo primero tendra para trabajar
editado on
la encontre peor no l ogro hacerla funcionar es
_GDIPlus_GraphicsDrawRect
la cargo pero yo me imagino que me debe aparecer el cuadro como en el facebook peor no lo veo
editado off
mnil mil gracias
Amigos buen dia
les escribo por lo sgte :
estoy adaptando un script que :
1 cargará una imagen
2 despues con un boton se selecionara un area de la imagen por ejemplo de 500 x 300
3 otro boton guardará el area selcionada con un nuevo nombre, la cual siempre tendra el mismo tamaño 500 x300
pero tengo un detalle necesito saber con cual comando puedo hacer el paso numero 2 ya que por lo que he buscado no lo he visto , para que se hagan una idea es muy parecido a cuando en el facebook se seleciona el area de una imagen paraque solo esa parte se vea en el perfil
despues les preguntre algo sobre coordenadas, ya que como lo hago ahora es arrastrando el muouse y creando el cuador a recortar epro seme sale de laimagen ym e tomaparte del aaplicacion , digo despues porque con lo primero tendra para trabajar
editado on
la encontre peor no l ogro hacerla funcionar es
_GDIPlus_GraphicsDrawRect
la cargo pero yo me imagino que me debe aparecer el cuadro como en el facebook peor no lo veo
editado off
mnil mil gracias
Re: seleccionar area en una imagen
me doy , llevo dos dias ya pensando como adpatar esto y mi nivel de novato novato no me esta ayudando, dejo el code haber si me pueden por favor colaborar
tengo los sgte problemas
1 el boton seleccionar
2 el botton guardar el area selcionada
3 lespregunto si roto la imagen en un angulo de 90 es posible hacer que aparezca centrada ?
el code esta un poco sucio peor ya he visto tantas vceces estas lineas que no recuerdo que le meti de todos modos lo que sobra no esta afectando
tengo los sgte problemas
1 el boton seleccionar
2 el botton guardar el area selcionada
3 lespregunto si roto la imagen en un angulo de 90 es posible hacer que aparezca centrada ?
el code esta un poco sucio peor ya he visto tantas vceces estas lineas que no recuerdo que le meti de todos modos lo que sobra no esta afectando
Código: Seleccionar todo
#include <FreeImage.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#Include <Misc.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <FreeImage.au3>
#include <GuiConstantsEx.au3>
#Include <Color.au3>
#Include <ScreenCapture.au3>
#Include <Misc.au3>
Global $iTolerance = 30, $iX1, $iY1, $iX2, $iY2, $aSP, $aMP, $fType = ""
Global $ImageHandle=-1, $WorkingFileName, $FIF,$GuiSizeX = $ImageHandle, $GuiSizeY = $ImageHandle ; estas dos tienen que ser las de la imagen
Local $hBMP, $hImage
; de la lineas 2 al a9 agregados
; Create transparent GUI with Cross cursor
GUICreate("Titulo aqui",800,700, $WS_EX_TOPMOST)
Global $ImageHandle=-1, $WorkingFileName, $FIF
_FreeImage_LoadDLL(@ScriptDir&"\FreeImage.dll")
_FreeImage_Initialise()
Func OnAutoItExit()
If $ImageHandle <>-1 Then _FreeImage_Unload($ImageHandle)
_FreeImage_DeInitialise()
EndFunc
;GUICreate("Titulo aqui",800,700)
$ShowPic = GUICtrlCreatePic("",0,0, 800,600)
$btnOpen = GUICtrlCreateButton("Escoger archivo", 10, 610, 100, 30)
GUICtrlSetTip(-1,"Only a copy of the image will be used")
$btnFlipH = GUICtrlCreateButton("Flip Horizontal", 120, 610, 100, 30)
$btnFlipV = GUICtrlCreateButton("Flip Vertical", 230, 610, 100, 30)
$btnRotate = GUICtrlCreateButton("Rotar ...", 340, 610, 100, 30)
$btnselecionar = GUICtrlCreateButton("Selecionar", 450, 610, 100, 30)
$btnguardar = GUICtrlCreateButton("Guardar", 560, 610, 100, 30)
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
Exit
Case $btnOpen
_OpenImage()
Case $btnFlipH
If $ImageHandle <> -1 Then
_FreeImage_FlipHorizontal($ImageHandle)
_FreeImage_SaveU($FIF, $ImageHandle, $WorkingFileName)
_ShowImage()
EndIf
Case $btnFlipV
If $ImageHandle <> -1 Then
_FreeImage_FlipVertical($ImageHandle)
_FreeImage_SaveU($FIF, $ImageHandle, $WorkingFileName)
_ShowImage()
EndIf
Case $btnRotate
If $ImageHandle <> -1 Then
$hImageNew = _FreeImage_RotateClassic($ImageHandle, Number(InputBox("Rotate", "angle for rotation", 90)))
_FreeImage_SaveU($FIF, $hImageNew, $WorkingFileName)
_FreeImage_Unload($ImageHandle)
$ImageHandle = $hImageNew
_ShowImage()
EndIf
Case $btnselecionar ; boton para selcionar el area
;_Mark_Rect()
Case $btnguardar ; boton para guardar el area selecionada
;_SaveRect()
EndSwitch
WEnd
Func _OpenImage()
Local $sFile = FileOpenDialog("Escoger imagen","", "Image Files (*.jpg;*.jpeg;*.bmp;*.gif;*.png)", 3)
If @error Then Return
If $ImageHandle <> -1 Then _FreeImage_Unload($ImageHandle)
Local $dot = StringInStr($sFile,".",1,-1)
Local $Name = StringLeft($sFile,$dot-1)
Local $Ext = StringMid($sFile,$dot)
$WorkingFileName = $Name &"_FI4AU3"&$Ext
FileCopy($sFile,$WorkingFileName)
$FIF = _FreeImage_GetFileTypeU($WorkingFileName)
If $FIF = $FIF_UNKNOWN Then
$FIF = _FreeImage_GetFIFFromFilenameU($WorkingFileName)
EndIf
$ImageHandle = _FreeImage_LoadU($FIF, $sFile)
_ShowImage()
EndFunc
Func _ShowImage()
Local $Width, $Height
_SizeProportional($Width, $Height, 800, 600, _FreeImage_GetWidth($ImageHandle), _FreeImage_GetHeight($ImageHandle))
GUICtrlSetPos($ShowPic,0,0,$Width, $Height)
GUICtrlSetImage($ShowPic, $WorkingFileName)
EndFunc
Func _SizeProportional(ByRef $Width, ByRef $Height, $WDesired, $HDesired, $WSrc, $HSrc)
; Prog@ndy
Local $RatioDes = ($WDesired / $HDesired)
Local $CurrentRatio = ($WSrc / $HSrc)
If $CurrentRatio > $RatioDes Then ; scale height
$Width = $WDesired
$Height = $WDesired / $CurrentRatio
Else ; scale width
$Width = $HDesired * $CurrentRatio
$Height = $HDesired
EndIf
EndFunc ;==>_SizeProportional
Func _SaveRect()
Local $ScaleX = $ImageHandle / $GuiSizeX, $ScaleY = $ImageHandle / $GuiSizeY , $fType
Local $hClone = _GDIPlus_BitmapCloneArea($hImage, $aSP[0] * $ScaleX, $aSP[1] * $ScaleY, ($aMP[0] - $aSP[0]) * $ScaleX, ($aMP[1] - $aSP[1]) * $ScaleY, $GDIP_PXF32ARGB)
_GDIPlus_ImageSaveToFile($hClone,@ScriptDir & "\Imagetst.jpg") ;$sNewName)
_GDIPlus_BitmapDispose($hClone)
ShellExecute(@ScriptDir & "\Imagetst.jpg")
EndFunc ;==>_SaveRect
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: seleccionar area en una imagen
En mi Capturador lo hago con regiones, haciendo un agujero en un formulario, el rectángulo que se ve es realmente la parte del formulario fuera del agujero:
http://www.emesn.com/autoitforum/viewto ... f=5&t=1848
Te explico:
Usé varias maneras, una fue GDI, otra era un formulario de fondo transparente con una etiqueta, lo que se veía era el borde de la etiqueta. No iban del todo bien, el aspecto del borde de la etiqueta no era tan controlable, con GDI a veces tenía problemas con los refrescos, quedaba sucia la pantalla... (piensa que como es un capturador de pantalla trabajo con todo el Screen, ¿qué pasa si recuadras sobre un video tocando o cualquier formulario animado? se borraban las líneas, se movían...)
Así que acabé usando un formulario pintado del color del recuadro, el formulario no aparece en tareas ni nada de eso. Para hacer un rectángulo hueco le hago un agujero, eso se hace definiendo regiones en el formulario. Creo una región que es todo el cliente RESTANDO otra región que es el agujero. En realidad se usan funciones GDI (concretamente uso CreateRectRgn, CombineRgn y SetWindowRgn) pero las uso a través de la UDF WinApi.au3 por comodidad.
Puedes verlo en dos modos de captura, el primero es cuando capturo un objeto (panel, botón, etiqueta, etc...), empieza en la función _CapturaObjeto (ahí por ejemplo creo el formulario). El formulario "recuadro" ($hRect_GUI) lo manipulo entonces en _RecuadraObjeto().
El otro modo es en la captura de un recuadro marcado por usuario (que además después de marcado se puede mover y redimensionar). Esto se parece bastante a lo que quieres. Empieza en la función _Marca_Rectan (bueno la captura en _CapturaRectan pero lo que te interesa está en la otra). Como ves es un poco compleja porque además de ir dibujando el recuadro crea una ventana de zoom, además creo un fondo transparente para que al marcar el usuario el rectángulo con el ratón no pinche sobre los formularios que hay debajo. Tendrás que mirarte esa función y _DibujaRectan, que es más o menos la anterior _RecuadraObjeto pero adaptada a este caso.
No hagas caso de los modos diferentes para XP y Vista con Aero, eso es por lo del zoom, el recuadro va perfectamente igual en los dos.
Suerte. Y si usas mi código espero que me cites en los créditos
http://www.emesn.com/autoitforum/viewto ... f=5&t=1848
Te explico:
Usé varias maneras, una fue GDI, otra era un formulario de fondo transparente con una etiqueta, lo que se veía era el borde de la etiqueta. No iban del todo bien, el aspecto del borde de la etiqueta no era tan controlable, con GDI a veces tenía problemas con los refrescos, quedaba sucia la pantalla... (piensa que como es un capturador de pantalla trabajo con todo el Screen, ¿qué pasa si recuadras sobre un video tocando o cualquier formulario animado? se borraban las líneas, se movían...)
Así que acabé usando un formulario pintado del color del recuadro, el formulario no aparece en tareas ni nada de eso. Para hacer un rectángulo hueco le hago un agujero, eso se hace definiendo regiones en el formulario. Creo una región que es todo el cliente RESTANDO otra región que es el agujero. En realidad se usan funciones GDI (concretamente uso CreateRectRgn, CombineRgn y SetWindowRgn) pero las uso a través de la UDF WinApi.au3 por comodidad.
Puedes verlo en dos modos de captura, el primero es cuando capturo un objeto (panel, botón, etiqueta, etc...), empieza en la función _CapturaObjeto (ahí por ejemplo creo el formulario). El formulario "recuadro" ($hRect_GUI) lo manipulo entonces en _RecuadraObjeto().
El otro modo es en la captura de un recuadro marcado por usuario (que además después de marcado se puede mover y redimensionar). Esto se parece bastante a lo que quieres. Empieza en la función _Marca_Rectan (bueno la captura en _CapturaRectan pero lo que te interesa está en la otra). Como ves es un poco compleja porque además de ir dibujando el recuadro crea una ventana de zoom, además creo un fondo transparente para que al marcar el usuario el rectángulo con el ratón no pinche sobre los formularios que hay debajo. Tendrás que mirarte esa función y _DibujaRectan, que es más o menos la anterior _RecuadraObjeto pero adaptada a este caso.
No hagas caso de los modos diferentes para XP y Vista con Aero, eso es por lo del zoom, el recuadro va perfectamente igual en los dos.
Suerte. Y si usas mi código espero que me cites en los créditos
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Re: seleccionar area en una imagen
hombre mil gracias tanto cogdigo como aplicacion me sirven bastante
mas rato lo reviso que acabo de comerzar jornada y ayer el ultimo mensaje lo deje a la 1 am asi que le sueño me puede, te pregunto podes hacerle un instalador a tu capturador porque sel ovoy a renviar a todos mis conocidos paraque lo usen eln laofician y pues ellos son algo cortos en cuestion de sistemas , yo el haria le manual de usuario en pdf
con respecto al code que voy a montar hasta ayer logre usar la funcion esa que te dije, lo que me esta pasando ahora es que me corta partioendo desde las coorednadas 0 , 0 , pero con tu code se que lo arreglare
nuevamente gracias m il
mas rato lo reviso que acabo de comerzar jornada y ayer el ultimo mensaje lo deje a la 1 am asi que le sueño me puede, te pregunto podes hacerle un instalador a tu capturador porque sel ovoy a renviar a todos mis conocidos paraque lo usen eln laofician y pues ellos son algo cortos en cuestion de sistemas , yo el haria le manual de usuario en pdf
con respecto al code que voy a montar hasta ayer logre usar la funcion esa que te dije, lo que me esta pasando ahora es que me corta partioendo desde las coorednadas 0 , 0 , pero con tu code se que lo arreglare
nuevamente gracias m il
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: seleccionar area en una imagen
¿Un instalador? ¡¡Sólo hay que copiar el EXE donde lo quieras!!
Maravillas de AutoIt, todo el programa en un sólo archivo ¿qué más se puede pedir?
Vaya, encantado si os es útil.
¿Un manual en PDF? genial...
Ya lo revisamos entre los dos y lo adjuntamos con la aplicación... o se puede pasar a html o ayuda de Windows, ya lo veremos.
No pensé que fuera tan importante hacerle un manual, pero vaya, así estaría más completo.
Hace mucho tiempo que no toco el programa y era algo complejo, pero si tienes dudas con él sólo tienes que preguntar.
Maravillas de AutoIt, todo el programa en un sólo archivo ¿qué más se puede pedir?
Vaya, encantado si os es útil.
¿Un manual en PDF? genial...
Ya lo revisamos entre los dos y lo adjuntamos con la aplicación... o se puede pasar a html o ayuda de Windows, ya lo veremos.
No pensé que fuera tan importante hacerle un manual, pero vaya, así estaría más completo.
Hace mucho tiempo que no toco el programa y era algo complejo, pero si tienes dudas con él sólo tienes que preguntar.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Re: seleccionar area en una imagen
jajajaj
figurate que si, es importante un manual de usuario si queremos que nuestros scripts sean usados por alguien mas que nosotros o gente que del medio, el usuario normal y basico le gusta ver una que otra imagen del programa funcionado o algun leame con 2 o 3 pasos, y me consta por que aunque no soy muy ducho en programcion pero si un tanto versado y estoy redeado den gente que sabe un poco menos y a veces me toca explicarles como funcionan los programas que tienen o como hacer x o y cosa , con plastilina com odecimos por aca
y lo del instalador, por lo mismo de lo anterior la gente desconfia de algo que le de doble click y se ejecute, les gustan lo accesos directos y dar siguiente, siguiente
no dejo aun el code del programa por el que cree este topic porque este fin de semana no revise nada de nada, me la pase jugando mario kart 64 con mi primo de 7 años en la pc y despues una buena tanda de cod 4 en internet
sin mencionar que perdi todo el domingo buscando algo sobre "normas vancouver para la publicacion de articulos " y no encontre nada quer me guiara
pero me interesa bastante eso del hpen y hacer el recuadro rojo para saber que esl oque tengo
figurate que si, es importante un manual de usuario si queremos que nuestros scripts sean usados por alguien mas que nosotros o gente que del medio, el usuario normal y basico le gusta ver una que otra imagen del programa funcionado o algun leame con 2 o 3 pasos, y me consta por que aunque no soy muy ducho en programcion pero si un tanto versado y estoy redeado den gente que sabe un poco menos y a veces me toca explicarles como funcionan los programas que tienen o como hacer x o y cosa , con plastilina com odecimos por aca
y lo del instalador, por lo mismo de lo anterior la gente desconfia de algo que le de doble click y se ejecute, les gustan lo accesos directos y dar siguiente, siguiente
no dejo aun el code del programa por el que cree este topic porque este fin de semana no revise nada de nada, me la pase jugando mario kart 64 con mi primo de 7 años en la pc y despues una buena tanda de cod 4 en internet
sin mencionar que perdi todo el domingo buscando algo sobre "normas vancouver para la publicacion de articulos " y no encontre nada quer me guiara
pero me interesa bastante eso del hpen y hacer el recuadro rojo para saber que esl oque tengo
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: seleccionar area en una imagen
Sinceramente, no voy a ponerme a hacer un instalador a un ejecutable autónomo...
Si quieres te haces un fake que lo único que haga es copiar el archivo a "archivos de programas" o al escritorio o donde quieras, incluso le puedes hacer un acceso directo, le pones 20 ventanas de "Siguiente" y ya está, tranquilo, no van a leer lo que ponga en la pantalla. Recuerda poner 3 ó 4 pantallitas de esas llenas de CLUF, declinaciones de garantía, condiciones de uso y tal, que sólo los mejores abogados entienden y que el usuario tiene que aceptar para seguir, ¡y aceptan, aunque esté en ruso!
Hablando más en serio si se van a sentir mejor siempre le puedes hacer un instalador rápido con Winrar, haciendo un EXE de esos que total lo único que tiene que hacer es descomprimir lo que hay dentro, aunque como pide carpeta destino y supongo que puedes hacer un acceso directo parece que sea un programa "profesional".
Y si así no les parece profesional, pues le quito la categoría de soft libre, les cobramos 10€ por licencia y ya está, profesional del todo (vamos a medias)
El manual tampoco lo veo tan vital, pero sí puede ampliar la información de lo que se ve en el GUI (que está en castellano y hasta le puse una etiquetita con el resumen de cómo usar cada modo). Pero bueno, si queda bien lo podemos añadir en la "distribución oficial".
Un "fake installer" no lo pondría pero puede ser divertido, y a lo mejor útil para los que desconfían de "programas de un archivo". Por cierto, que puedo coger el exe y meterle morralla hasta que ocupe unas 10 megas, en vez de 280KB. También puedo generar matrices de miles de cadenas de miles de caracteres para que el programa ocupe en memoria unas 100 megas, en vez de unas 5 (que ya me parece mucho), así parecerá que hace algo
Si quieres te haces un fake que lo único que haga es copiar el archivo a "archivos de programas" o al escritorio o donde quieras, incluso le puedes hacer un acceso directo, le pones 20 ventanas de "Siguiente" y ya está, tranquilo, no van a leer lo que ponga en la pantalla. Recuerda poner 3 ó 4 pantallitas de esas llenas de CLUF, declinaciones de garantía, condiciones de uso y tal, que sólo los mejores abogados entienden y que el usuario tiene que aceptar para seguir, ¡y aceptan, aunque esté en ruso!
Hablando más en serio si se van a sentir mejor siempre le puedes hacer un instalador rápido con Winrar, haciendo un EXE de esos que total lo único que tiene que hacer es descomprimir lo que hay dentro, aunque como pide carpeta destino y supongo que puedes hacer un acceso directo parece que sea un programa "profesional".
Y si así no les parece profesional, pues le quito la categoría de soft libre, les cobramos 10€ por licencia y ya está, profesional del todo (vamos a medias)
El manual tampoco lo veo tan vital, pero sí puede ampliar la información de lo que se ve en el GUI (que está en castellano y hasta le puse una etiquetita con el resumen de cómo usar cada modo). Pero bueno, si queda bien lo podemos añadir en la "distribución oficial".
Un "fake installer" no lo pondría pero puede ser divertido, y a lo mejor útil para los que desconfían de "programas de un archivo". Por cierto, que puedo coger el exe y meterle morralla hasta que ocupe unas 10 megas, en vez de 280KB. También puedo generar matrices de miles de cadenas de miles de caracteres para que el programa ocupe en memoria unas 100 megas, en vez de unas 5 (que ya me parece mucho), así parecerá que hace algo
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: seleccionar area en una imagen
Juer chavales....que usuarios más desconfiados .
Hombre, pienso que si el archivo exe se lo da una persona de confianza (que sería tu caso timistar) no deberían desconfiar.
Yo, en mi caso, prefiero que el programa venga en un solo archivo y se ejecute rapidamente a que se instale en el ordenador. Piensa en la gran fama que van teniendo los programas portables, los cuales suelen estar en un único archivo, y si los que hacen estos portables quisieran meternos algo lo podrían meter .
Bueno....cuestión de gustos .
Bueno, ahora al tema del Asunto.
Como prometí, os pongo el pequeño script que he hecho para solucionar este asunto
Pulsando control+o se habre la ventana para cargar un archivo imagen, y con control+s para guardar el recuadro hecho en la imagen.
Una vez que cargeis una imagen, para recuadrar, mantener pulsado el botón izquierdo del ratón y mover éste.
La parte para hacer el recuadro la he hecho con los mensajes evento del ratón que captura la función GUIGetMsg(). Al final me salio algo más complicado de lo que creía, pero funciona bien (creo).
Inicialmente lo hice así para no bloquear en ningún momento el script, aunque pensándolo bien, al recuadrar, el script no suele tener que hacer nada más . Puede que hubiese sido más facil haciendolo con un bucle while _ispressed("01").....wend dentro del evento $GUI_EVENT_PRIMARYDOWN. Así lo he visto en algunos sitios.
Bueno, si quereis hacerlo así no es muy dificil pasarlo .
Y ahora lo importante. Verdaderamente lo importante para resolver la raiz del asunto es utilizar la función _GDIPlus_BitmapCloneArea, con la cual puedes almacenar el área del tamaño que tu le indiques de una imagen.
Saludos.
Hombre, pienso que si el archivo exe se lo da una persona de confianza (que sería tu caso timistar) no deberían desconfiar.
Yo, en mi caso, prefiero que el programa venga en un solo archivo y se ejecute rapidamente a que se instale en el ordenador. Piensa en la gran fama que van teniendo los programas portables, los cuales suelen estar en un único archivo, y si los que hacen estos portables quisieran meternos algo lo podrían meter .
Bueno....cuestión de gustos .
Bueno, ahora al tema del Asunto.
Como prometí, os pongo el pequeño script que he hecho para solucionar este asunto
Código: Seleccionar todo
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
Opt("MouseCoordMode", 2)
HotKeySet("^o","_Abrir")
HotKeySet("^s","_Guardar")
GUIRegisterMsg($WM_PAINT, "WM_PAINT")
Global $hGUI, $hBitmap=0, $hGraphic
Global $iWidth, $iHeight, $hPen, $BotonRatonPulsado, $RectIniX, $RectIniY, $posMouse[2]
Global $RectX, $RectY, $RectWidth, $RectHeight
; Crear GUI
$hGUI = GUICreate("Abrir Imagen: CTRL+o. Guardar imagen: CTRL+s", 400, 300)
GUISetBkColor(0x990000)
GUISetState()
; Inicializar librería GDI+
_GDIPlus_Startup ()
$hPen = _GDIPlus_PenCreate (0xff990000,2)
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
_Salir()
Case $GUI_EVENT_RESTORE
WM_PAINT()
Case $GUI_EVENT_PRIMARYDOWN ;si pulsamos el botón izquierdo del ratón se ejecuta esto.
If $hBitmap Then
$posMouse = MouseGetPos()
If $posMouse[1]>=0 Then
$BotonRatonPulsado=1
ToolTip($posMouse[0] & "," & $posMouse[1])
$RectIniX=$posMouse[0]
$RectIniY=$posMouse[1]
$RectX=$posMouse[0]
$RectY=$posMouse[1]
EndIf
EndIf
Case $GUI_EVENT_MOUSEMOVE ;si movemos el ratón se redibuja el recuadro.
If $hBitmap And $BotonRatonPulsado Then
$posMouse = MouseGetPos()
$TipX=$posMouse[0]
$TipY=$posMouse[1]
$RectWidth=$posMouse[0] - $RectIniX
$RectHeight=$posMouse[1] - $RectIniY
If $RectWidth<0 Then
$RectX=$posMouse[0]
$RectWidth=-($RectWidth)
Else
$RectX=$RectIniX
EndIf
If $RectHeight<0 Then
$RectY=$posMouse[1]
$RectHeight=-($RectHeight)
Else
$RectY=$RectIniY
EndIf
;Con esta parte hacemos que el recuadro se quede en los límites de la ventana
If $iWidth<$posMouse[0] Then
$RectWidth=$iWidth-$RectIniX
$TipX=$iWidth
EndIf
If $iHeight<$posMouse[1] Then
$RectHeight=$iHeight-$RectIniY
$TipY=$iHeight
EndIf
If $posMouse[0]<0 Then
$RectX=0
$RectWidth=$RectIniX
$TipX=0
EndIf
If $posMouse[1]<0 Then
$RectY=0
$RectHeight=$RectIniY
$TipY=0
EndIf
ToolTip($TipX & "," & $TipY)
WM_PAINT()
EndIf
Case $GUI_EVENT_PRIMARYUP
ToolTip("")
$BotonRatonPulsado=0
EndSwitch
WEnd
Func _Guardar()
$numAleatorio=Random(0,10000,1)
$FicheroPath = FileSaveDialog("Guardar imagen", @ScriptDir, "Imagenes (*.jpg;*.jpeg;*.png;*.bmp;*.gif)", 3, "Imagen" & $numAleatorio & ".jpg")
If @error Or $FicheroPath = "" Then Return
$RectImagen=_GDIPlus_BitmapCloneArea($hBitmap, $RectX, $RectY, $RectWidth, $RectHeight)
If $RectImagen Then
_GDIPlus_ImageSaveToFile($RectImagen,$FicheroPath)
Else
MsgBox(0,"Error al guardar imagen","No se ha encontrado el recuadro en la imagen" & @cr & "Se ha producido un error y no se ha podido guardar el recuadro de imagen.")
EndIf
EndFunc
Func _Salir()
; Clean up resources
_GDIPlus_GraphicsDispose ($hGraphic)
_GDIPlus_BitmapDispose ($hBitmap)
; Shut down GDI+ library
_GDIPlus_ShutDown ()
Exit
EndFunc
Func _Abrir()
$FicheroPath = FileOpenDialog("Abrir imagen", @ScriptDir, "Imagenes (*.jpg;*.jpeg;*.png;*.bmp;*.gif)", 3)
If @error Or $FicheroPath = "" Then Return
$hBitmap = _GDIPlus_BitmapCreateFromFile ($FicheroPath)
_WinEscala($hBitmap)
EndFunc
Func _WinEscala($hBitmap)
$iWidth = _GDIPlus_ImageGetWidth($hBitmap)
$iHeight = _GDIPlus_ImageGetHeight($hBitmap)
$Pos = WinGetPos($hGui)
WinMove($hGui, "", $Pos[0], $Pos[1], $iWidth + 7, $iHeight + 26)
$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
WM_PAINT()
EndFunc
Func WM_PAINT()
_GDIPlus_GraphicsDrawImage ($hGraphic, $hBitmap, 0, 0)
_GDIPlus_GraphicsDrawRect($hGraphic, $RectX, $RectY, $RectWidth, $RectHeight, $hPen)
EndFunc
Una vez que cargeis una imagen, para recuadrar, mantener pulsado el botón izquierdo del ratón y mover éste.
La parte para hacer el recuadro la he hecho con los mensajes evento del ratón que captura la función GUIGetMsg(). Al final me salio algo más complicado de lo que creía, pero funciona bien (creo).
Inicialmente lo hice así para no bloquear en ningún momento el script, aunque pensándolo bien, al recuadrar, el script no suele tener que hacer nada más . Puede que hubiese sido más facil haciendolo con un bucle while _ispressed("01").....wend dentro del evento $GUI_EVENT_PRIMARYDOWN. Así lo he visto en algunos sitios.
Bueno, si quereis hacerlo así no es muy dificil pasarlo .
Y ahora lo importante. Verdaderamente lo importante para resolver la raiz del asunto es utilizar la función _GDIPlus_BitmapCloneArea, con la cual puedes almacenar el área del tamaño que tu le indiques de una imagen.
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: seleccionar area en una imagen
Bueno, como no estaba muy convencido de como dejé el código esparcido que hace el recuadro para marcar el área de la imagen, he hecho otro en una función....más recogido, más claro (eso creo ), pero un poco más dificil ya que utilizo alguna función GDI+ más (gracias a esto evito totalmente el pequeño parpadeo al crear el recuadro). Este código utiliza el método que dije anteriormente de mejer la creación del recuadro en un while.....wend.
También tengo que agradecer a los creadores de códigos de este estilo, y sobre todo a uno del foro aleman (no recuerdo el link) del cual he copiado algo de código para realizar el mío.
Dicho esto, aquí va:
Coger el que más os guste .
Saludos.
También tengo que agradecer a los creadores de códigos de este estilo, y sobre todo a uno del foro aleman (no recuerdo el link) del cual he copiado algo de código para realizar el mío.
Dicho esto, aquí va:
Código: Seleccionar todo
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
Opt("MouseCoordMode", 2)
HotKeySet("^o","_Abrir")
HotKeySet("^s","_Guardar")
GUIRegisterMsg($WM_PAINT, "WM_PAINT")
Global $hGUI, $hBitmap=0, $hGraphic=0, $iclone=0
Global $iWidth, $iHeight, $hPen, $RectIniX, $RectIniY, $posMouse
Global $RectX, $RectY, $RectWidth, $RectHeight
; Crear GUI
$hGUI = GUICreate("Abrir Imagen con CTRL+o. Guardar imagen con CTRL+s", 400, 300)
GUISetBkColor(0x990000)
GUISetState()
; Inicializar librería GDI+
_GDIPlus_Startup ()
$hPen = _GDIPlus_PenCreate (0xff990000,2)
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
_Salir()
Case $GUI_EVENT_RESTORE
WM_PAINT()
Case $GUI_EVENT_PRIMARYDOWN ;si pulsamos el botón izquierdo del ratón se ejecuta esto.
_DibujarRecuadro()
EndSwitch
WEnd
Func _Guardar()
$numAleatorio=Random(0,10000,1)
$FicheroPath = FileSaveDialog("Guardar imagen", @ScriptDir, "Imagenes (*.jpg;*.jpeg;*.png;*.bmp;*.gif)", 3, "Imagen" & $numAleatorio & ".jpg")
If @error Or $FicheroPath = "" Then Return
$RectImagen=_GDIPlus_BitmapCloneArea($hBitmap, $RectX, $RectY, $RectWidth, $RectHeight)
If $RectImagen Then
_GDIPlus_ImageSaveToFile($RectImagen,$FicheroPath)
Else
MsgBox(0,"Error al guardar imagen","No se ha encontrado el recuadro en la imagen" & @cr & "Se ha producido un error y no se ha podido guardar el recuadro de imagen.")
EndIf
EndFunc
Func _Salir()
; Clean up resources
_GDIPlus_GraphicsDispose ($hGraphic)
_GDIPlus_BitmapDispose ($hBitmap)
; Shut down GDI+ library
_GDIPlus_ShutDown ()
Exit
EndFunc
Func _Abrir()
$FicheroPath = FileOpenDialog("Abrir imagen", @ScriptDir, "Imagenes (*.jpg;*.jpeg;*.png;*.bmp;*.gif)", 3)
If @error Or $FicheroPath = "" Then Return
$hBitmap = _GDIPlus_BitmapCreateFromFile ($FicheroPath)
_WinEscala($hBitmap)
EndFunc
Func _WinEscala($hBitmap)
$iWidth = _GDIPlus_ImageGetWidth($hBitmap)
$iHeight = _GDIPlus_ImageGetHeight($hBitmap)
$Pos = WinGetPos($hGui)
WinMove($hGui, "", $Pos[0], $Pos[1], $iWidth + 7, $iHeight + 26)
$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
$iClone= _GDIPlus_BitmapCloneArea($hBitmap, 0, 0, $iWidth, $iHeight)
WM_PAINT()
EndFunc
Func WM_PAINT()
;If $hgraphic Then _GDIPlus_GraphicsDrawImageRect($hGraphic, $iclone, 0, 0, $iWidth, $iHeight)
_GDIPlus_GraphicsDrawImageRect($hGraphic, $iclone, 0, 0, $iWidth, $iHeight)
EndFunc
Func _DibujarRecuadro()
$posMouse = MouseGetPos()
If $hBitmap And $posMouse[1]>=0 Then
$iClone= _GDIPlus_BitmapCloneArea($hBitmap, 0, 0, $iWidth, $iHeight)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($iclone)
_GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
ToolTip($posMouse[0] & "," & $posMouse[1])
$RectIniX=$posMouse[0]
$RectIniY=$posMouse[1]
$RectX=$posMouse[0]
$RectY=$posMouse[1]
While _IsPressed("01")
_GDIPlus_GraphicsDrawImageRect($hBuffer, $hbitmap, 0, 0, $iWidth, $iHeight)
$posMouse = MouseGetPos()
$TipX=$posMouse[0]
$TipY=$posMouse[1]
$RectWidth=$posMouse[0] - $RectIniX
$RectHeight=$posMouse[1] - $RectIniY
If $RectWidth<0 Then
$RectX=$posMouse[0]
$RectWidth=-($RectWidth)
Else
$RectX=$RectIniX
EndIf
If $RectHeight<0 Then
$RectY=$posMouse[1]
$RectHeight=-($RectHeight)
Else
$RectY=$RectIniY
EndIf
;Con esta parte hacemos que el recuadro se quede en los límites de la ventana
If $iWidth<$posMouse[0] Then
$RectWidth=$iWidth-$RectIniX
$TipX=$iWidth
EndIf
If $iHeight<$posMouse[1] Then
$RectHeight=$iHeight-$RectIniY
$TipY=$iHeight
EndIf
If $posMouse[0]<0 Then
$RectX=0
$RectWidth=$RectIniX
$TipX=0
EndIf
If $posMouse[1]<0 Then
$RectY=0
$RectHeight=$RectIniY
$TipY=0
EndIf
ToolTip($TipX & "," & $TipY)
_GDIPlus_GraphicsDrawRect($hBuffer, $RectX, $RectY, $RectWidth, $RectHeight, $hPen)
WM_PAINT()
Sleep(10)
WEnd
ToolTip("")
_GDIPlus_GraphicsDispose($hBuffer)
EndIf
EndFunc
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Re: seleccionar area en una imagen
jajajaj m i l gracias
chefito sos grande
fijate que si, este es el que es solo tiene un detalle y es que no esta escalando la imagen , por ejmplo cargale una imagen de 1900 x 1200 y te abre un gui de ese tamaño , mirame a ver si puedo adaptar una funcion de escalarla a tu codigo
si en el foro aleman han trabaajo esto vairas veces a mi el que me puso el code fue prog@andy en el foro americano pero el es de por alla dejo el code que el me paso qace poco, el detallr que tiene es que metes el ancho de lo que vas a cortar las coorenadas peor saber eso para u n user normal es bien dificil si no imposible
pa ra vos y lsoque me han ayudado sirmep en l que lespueda yduar cosa pues que se por intenr por las distancias me dice y con gusto volteamos en el asnuto aun que deprogramacion soy basico hacia abajo lo mio es mas lo social y de dinfundir la palabras o ideas
chefito sos grande
fijate que si, este es el que es solo tiene un detalle y es que no esta escalando la imagen , por ejmplo cargale una imagen de 1900 x 1200 y te abre un gui de ese tamaño , mirame a ver si puedo adaptar una funcion de escalarla a tu codigo
si en el foro aleman han trabaajo esto vairas veces a mi el que me puso el code fue prog@andy en el foro americano pero el es de por alla dejo el code que el me paso qace poco, el detallr que tiene es que metes el ancho de lo que vas a cortar las coorenadas peor saber eso para u n user normal es bien dificil si no imposible
pa ra vos y lsoque me han ayudado sirmep en l que lespueda yduar cosa pues que se por intenr por las distancias me dice y con gusto volteamos en el asnuto aun que deprogramacion soy basico hacia abajo lo mio es mas lo social y de dinfundir la palabras o ideas
Código: Seleccionar todo
#include <FreeImage.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#Include <Misc.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <FreeImage.au3>
#include <GuiConstantsEx.au3>
#Include <Color.au3>
#Include <ScreenCapture.au3>
#Include <Misc.au3>
Global $ImageHandle=-1, $WorkingFileName, $FIF,$inpCropX, $inpCropY,$ShowPic, $hImageNew,$inpCropH, $inpCropW,$btnInvert, $btnRotate, $btnFlipV,$btnFlipH,$btnOpen,$btnCrop,$a;,$a[0],$a[1]
_FreeImage_LoadDLL(@ScriptDir&"\FreeImage.dll")
_FreeImage_Initialise()
;/*/*/*/*/
Opt('MustDeclareVars', 1)
HotKeySet("{Esc}", "GetPos")
;/*/*/*/*
Func OnAutoItExit()
If $ImageHandle <>-1 Then _FreeImage_Unload($ImageHandle)
_FreeImage_DeInitialise()
EndFunc
GUICreate("Titulo aqui",800,700)
$ShowPic = GUICtrlCreatePic("",0,0, 800,600)
$btnOpen = GUICtrlCreateButton("Choose File", 10, 610, 100, 30)
GUICtrlSetTip(-1,"Only a copy of the image will be used")
$btnFlipH = GUICtrlCreateButton("Flip Horizontal", 120, 610, 100, 30)
$btnFlipV = GUICtrlCreateButton("Flip Vertical", 230, 610, 100, 30)
$btnRotate = GUICtrlCreateButton("Rotate ...", 340, 610, 100, 30)
$btnInvert = GUICtrlCreateButton("Invert", 450, 610, 100, 30)
$btnCrop = GUICtrlCreateButton("Crop ...", 560, 610, 100, 30)
;$inpCropX = GUICtrlCreateInput("", 560, 650, 50, 20)
;GUICtrlSetTip(-1, "Crop X-Position")
;$inpCropY = GUICtrlCreateInput("", 610, 650, 50, 20)
;GUICtrlSetTip(-1, "Crop Y-Position")
;$inpCropX =$a[0]
;$inpCropY = $a[1]
$inpCropW = GUICtrlCreateInput("320", 560, 670, 50, 20)
GUICtrlSetTip(-1, "Crop Width")
$inpCropH = GUICtrlCreateInput("480", 610, 670, 50, 20)
GUICtrlSetTip(-1, "Crop Height")
GUISetState()
While 1
Switch GUIGetMsg()
Case -3
Exit
Case $btnOpen
_OpenImage()
Case $btnFlipH
If $ImageHandle <> -1 Then
_FreeImage_FlipHorizontal($ImageHandle)
_FreeImage_SaveU($FIF, $ImageHandle, $WorkingFileName)
_ShowImage()
EndIf
Case $btnFlipV
If $ImageHandle <> -1 Then
_FreeImage_FlipVertical($ImageHandle)
_FreeImage_SaveU($FIF, $ImageHandle, $WorkingFileName)
_ShowImage()
EndIf
Case $btnInvert
If $ImageHandle <> -1 Then
MsgBox( 0, "", _FreeImage_Invert($ImageHandle) & " - " & @error)
_FreeImage_SaveU($FIF, $ImageHandle, $WorkingFileName)
_ShowImage()
EndIf
Case $btnRotate
If $ImageHandle <> -1 Then
$hImageNew = _FreeImage_RotateClassic($ImageHandle, Number(InputBox("Rotate", "angle for rotation", 90)))
_FreeImage_SaveU($FIF, $hImageNew, $WorkingFileName)
_FreeImage_Unload($ImageHandle)
$ImageHandle = $hImageNew
_ShowImage()
EndIf
Case $btnCrop
;Local $x = Int(GUICtrlRead($inpCropX)), $y = Int(GUICtrlRead($inpCropY)), $w = Int(GUICtrlRead($inpCropW)), $h = Int(GUICtrlRead($inpCropH))
Local $x = $inpCropX, $y = $inpCropY,$w = Int(GUICtrlRead($inpCropW)), $h = Int(GUICtrlRead($inpCropH))
If $x>=0 And $y>=0 And $w>0 And $h>0 Then
$hImageNew = _FreeImage_Copy($ImageHandle, $x, $y, $x+$w, $y+$h)
_FreeImage_SaveU($FIF, $hImageNew, $WorkingFileName)
_FreeImage_Unload($ImageHandle)
$ImageHandle = $hImageNew
_ShowImage()
EndIf
EndSwitch
WEnd
Func _OpenImage()
Local $sFile = FileOpenDialog("Escoger imagen","", "Image Files (*.jpg;*.jpeg;*.bmp;*.gif;*.png)", 3)
If @error Then Return
If $ImageHandle <> -1 Then _FreeImage_Unload($ImageHandle)
Local $dot = StringInStr($sFile,".",1,-1)
Local $Name = StringLeft($sFile,$dot-1)
Local $Ext = StringMid($sFile,$dot)
$WorkingFileName = $Name &"_FI4AU3"&$Ext
FileCopy($sFile,$WorkingFileName)
$FIF = _FreeImage_GetFileTypeU($WorkingFileName)
If $FIF = $FIF_UNKNOWN Then
$FIF = _FreeImage_GetFIFFromFilenameU($WorkingFileName)
EndIf
$ImageHandle = _FreeImage_LoadU($FIF, $sFile)
_ShowImage()
EndFunc
Func _ShowImage()
Local $Width, $Height
_SizeProportional($Width, $Height, 800, 600, _FreeImage_GetWidth($ImageHandle), _FreeImage_GetHeight($ImageHandle))
GUICtrlSetPos($ShowPic,0,0,$Width, $Height)
GUICtrlSetImage($ShowPic, $WorkingFileName)
EndFunc
Func _SizeProportional(ByRef $Width, ByRef $Height, $WDesired, $HDesired, $WSrc, $HSrc)
; Prog@ndy
Local $RatioDes = ($WDesired / $HDesired)
Local $CurrentRatio = ($WSrc / $HSrc)
If $CurrentRatio > $RatioDes Then ; scale height
$Width = $WDesired
$Height = $WDesired / $CurrentRatio
Else ; scale width
$Width = $HDesired * $CurrentRatio
$Height = $HDesired
EndIf
EndFunc ;==>_SizeProportional
Func GetPos()
;Local $a
$a = GUIGetCursorInfo()
GUICtrlSetData($inpCropX, $a[0])
GUICtrlSetData($inpCropY, $a[1])
EndFunc ;==>GetPos
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: seleccionar area en una imagen
Mmmmmm. Antes de nada procura escribir mejor que parte de tus mensajes a veces no se entienden nada .
Ya he hecho demasiado creando un recuadro a medida, el cual no se sale de la ventana y otros errores corregidos.
Te aseguro que yo puedo adaptar eso y más (por lo menos en este caso) pero el script lo acabaría haciendo yo .
Intentala adaptar tú a ver si puedes hacer algo. Si no te sale pon el código aunque esté erroneo y te intentaremos ayudar.
Yo hace poco resolví una duda respecto a poder hacer scroll a una imagen cargada en una ventana. Así, tuviese el tamaño que tuviese siempre podrías verla entera. Lo malo es que creo que se perdío ese post cuando hubo un problema con la base de datos del foro . Y peor aun, yo no lo guardé , y no tengo ganas de hacerlo denuevo . A ver si alguien lo guardó y lo vuelve a colgar.
Adaptando ese código al que he puesto aquí, podría servir de solución.
Puedes ver algo de lo que te digo mirando en la ayuda el ejemplo de la función _GUIScrollBars_Init.
Otra solución es como tu dices escalar la imagen a un cierto porcentaje. Eso tampoco es muy complicado. Lo que pasa que tendrías que ver otras cosas, como un recálculo de las coordenadas del recuadro en la imagen escalada a la imagen original . Aunque tampoco lo veo muy complicado.
Intenta algo de lo que te he dicho.
El código que me muestras utiliza una udf que no tengo ni conozco. Y si te refieres a intentar adaptar la función _SizeProportional a mi código, si se podría, lo malo es que es una función que hacer referencia a las variables y habría que cambiar el nombre de algunas de mis variables (o de la función).
Aunque te digo que no es nada dificil calcular una imagen con una medida proporcional a la original. Son simplemente dos reglas de tres . O en porcentaje, una simple multiplicación .
Saludos.
Ya sabía que habría ese problema. Esto era un ejemplo de como se podía hacer, no un script entero.timistar escribió:fijate que si, este es el que es solo tiene un detalle y es que no esta escalando la imagen , por ejmplo cargale una imagen de 1900 x 1200 y te abre un gui de ese tamaño
Ya he hecho demasiado creando un recuadro a medida, el cual no se sale de la ventana y otros errores corregidos.
Solo decirte que lo intentes tú.timistar escribió:mirame a ver si puedo adaptar una funcion de escalarla a tu codigo
Te aseguro que yo puedo adaptar eso y más (por lo menos en este caso) pero el script lo acabaría haciendo yo .
Intentala adaptar tú a ver si puedes hacer algo. Si no te sale pon el código aunque esté erroneo y te intentaremos ayudar.
Ya sabes que nosotros siempre intentaremos ayudar, pero tú te tienes que esforzar un poquito e intentar hacer tus códigos. No puedes poner la escusa de que de programación eres muy básico y que lo tuyo es lo social, porque en ese caso te diría lo que a muchos.....si quieres que te hagan un programa, paga por ello .timistar escribió:pa ra vos y lsoque me han ayudado sirmep en l que lespueda yduar cosa pues que se por intenr por las distancias me dice y con gusto volteamos en el asnuto aun que deprogramacion soy basico hacia abajo lo mio es mas lo social y de dinfundir la palabras o ideas
Yo hace poco resolví una duda respecto a poder hacer scroll a una imagen cargada en una ventana. Así, tuviese el tamaño que tuviese siempre podrías verla entera. Lo malo es que creo que se perdío ese post cuando hubo un problema con la base de datos del foro . Y peor aun, yo no lo guardé , y no tengo ganas de hacerlo denuevo . A ver si alguien lo guardó y lo vuelve a colgar.
Adaptando ese código al que he puesto aquí, podría servir de solución.
Puedes ver algo de lo que te digo mirando en la ayuda el ejemplo de la función _GUIScrollBars_Init.
Otra solución es como tu dices escalar la imagen a un cierto porcentaje. Eso tampoco es muy complicado. Lo que pasa que tendrías que ver otras cosas, como un recálculo de las coordenadas del recuadro en la imagen escalada a la imagen original . Aunque tampoco lo veo muy complicado.
Intenta algo de lo que te he dicho.
El código que me muestras utiliza una udf que no tengo ni conozco. Y si te refieres a intentar adaptar la función _SizeProportional a mi código, si se podría, lo malo es que es una función que hacer referencia a las variables y habría que cambiar el nombre de algunas de mis variables (o de la función).
Aunque te digo que no es nada dificil calcular una imagen con una medida proporcional a la original. Son simplemente dos reglas de tres . O en porcentaje, una simple multiplicación .
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: seleccionar area en una imagen
Interesante, seguro que aprendo cosas de aquí, a ver esto de los eventos WM_PAINT...
Me quedo con el segundo... aunque no me funciona.
Me salta enseguida con un error dentro de la API GDI+.
Ah, ya veo, me parece que es al abrir el formulario, como está registrado WM_PAINT intenta dibujar el bitmap... sólo que como no ha dado tiempo de cargar una imagen ese bitmap aún no existe y el _GDIPlus_GraphicsDrawImageRect falla porque $hGraphic no está asignado.
De todas maneras me parece más fácil el que hice yo con los agujeros
Me quedo con el segundo... aunque no me funciona.
Me salta enseguida con un error dentro de la API GDI+.
Ah, ya veo, me parece que es al abrir el formulario, como está registrado WM_PAINT intenta dibujar el bitmap... sólo que como no ha dado tiempo de cargar una imagen ese bitmap aún no existe y el _GDIPlus_GraphicsDrawImageRect falla porque $hGraphic no está asignado.
De todas maneras me parece más fácil el que hice yo con los agujeros
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: seleccionar area en una imagen
Del segundo me he dado cuenta de un problema. Y es que se relentiza cuando una foto es escesivamente grande. No creo que lo mejore, asique así se queda . El que quiera mejoras ya sabe.....a currarselo.Ximorro escribió:Interesante, seguro que aprendo cosas de aquí, a ver esto de los eventos WM_PAINT...
Me quedo con el segundo... aunque no me funciona.
No te creas que es más facil. Además no me parece la forma más correcta de hacer esto en estos casos. He visto que utilizas las apis de regiones de una ventana para eso. Es una forma de hacerlo, pero no me acaba de convencer. Yo evitaba el tener que utilizar las apis de regiones haciendo transparente un color específoco del formulario (un pequeño truquillo para no complicarme mucho la vida ). Aunque como siempre digo, si funciona bien para lo que quieres, bien hecho está .Ximorro escribió:De todas maneras me parece más fácil el que hice yo con los agujeros
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Re: seleccionar area en una imagen
jejeje
mil gracias
pido disculpas por lo de los mensajes indescifrables, trato pero no lo puedo evitar inclusive mientras escribo esto estoy pensando en otra cosa, tengo un gran defecto algunos le dicen virtud y es que no puedo pensar en una solo opción para algo sino que mi cabeza baraja X cantidad de posibilidades mientras estoy realizando una acción , cosa que me ha hecho duro en la programación por que a veces empiezo a ver un code y ya estoy pensando hasta en con que me puede salir el usuario ,
unos lo llaman paranoia otros estrategia , yo lo llamo dificultad
muy agradecido
timistar
ps
en el trabajo es aun mas dificl por que los meails los leo y los entiendo poer los demas no me toca escribir corto para no divagar
jejejeje
mil gracias
pido disculpas por lo de los mensajes indescifrables, trato pero no lo puedo evitar inclusive mientras escribo esto estoy pensando en otra cosa, tengo un gran defecto algunos le dicen virtud y es que no puedo pensar en una solo opción para algo sino que mi cabeza baraja X cantidad de posibilidades mientras estoy realizando una acción , cosa que me ha hecho duro en la programación por que a veces empiezo a ver un code y ya estoy pensando hasta en con que me puede salir el usuario ,
unos lo llaman paranoia otros estrategia , yo lo llamo dificultad
muy agradecido
timistar
ps
en el trabajo es aun mas dificl por que los meails los leo y los entiendo poer los demas no me toca escribir corto para no divagar
jejejeje
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: seleccionar area en una imagen
Chefito no entiendo cómo te funciona el segundo ejemplo, a mí nada más abrir el formulario se activa un mensaje WM_PAINT, y como el bitmap aún no se ha cargado da error y finaliza el programa ¿a ti no te pasa?
En el capturador lo de las regiones fue el mejor método que encontré, ciertamente cada problemática puede tener su solución diferente. En este caso se trata de un entorno controlado, dibujas sobre tu GUI sobre tu imagen, pero en el capturador dibujo sobre la pantalla, el recuadro puede atravesar diferentes ventanas... que además pueden estar animadas, como esta página web con los emoticonos animados al lado (estoy en edición, claro), o imagínate que pasas por una ventana que está tocando un video...
De hecho esto de las regiones fue el tercer intento, primero probé con algo parecido a lo tuyo, aunque no podía usar el WM_PAINT de mi formulario, dibujaba sobre el escritorio, pero las ventanas animadas o cambiantes me podían borrar las líneas. Después hice lo que comentas de tener un color transparente (con LayeredWindows) y el recuadro era el borde de una etiqueta que iba redimensionando y recolocando con el ratón, pero no podía manejar el aspecto de ese borde a mi gusto, cambiaba en Vista y XP, etc...
Así que el tercer intento fue el de las regiones y como me solucionó los problemas así se queda
Así que timistar, claro que no es problema probar diferentes posibilidades, a veces es necesario para mejorar algún aspecto que no va del todo bien, a veces es para ver si otra cosa que se te ha ocurrido es más eficiente, rápida, elegante, etc... y a veces ¡simplemente es interesante para aprender!
Claro que otra cosa es lo de los mensajes en clave, si cuando escribes estás pensando en otra cosa y sale eso... mejor no pienses en otra cosa. Una cosa es tener la mente abierta y pensar en varias posibilidades para solucionar un problema, eso es genial, pero otra cosa diferente es no concentrarse en lo que se está haciendo y por lo tanto hacerlo mal. Mira esa última frase tuya... hay que leerla 3 veces y no tengo claro haberlo entendido del todo. No soy ninguna lumbrera pero leer sé
En el capturador lo de las regiones fue el mejor método que encontré, ciertamente cada problemática puede tener su solución diferente. En este caso se trata de un entorno controlado, dibujas sobre tu GUI sobre tu imagen, pero en el capturador dibujo sobre la pantalla, el recuadro puede atravesar diferentes ventanas... que además pueden estar animadas, como esta página web con los emoticonos animados al lado (estoy en edición, claro), o imagínate que pasas por una ventana que está tocando un video...
De hecho esto de las regiones fue el tercer intento, primero probé con algo parecido a lo tuyo, aunque no podía usar el WM_PAINT de mi formulario, dibujaba sobre el escritorio, pero las ventanas animadas o cambiantes me podían borrar las líneas. Después hice lo que comentas de tener un color transparente (con LayeredWindows) y el recuadro era el borde de una etiqueta que iba redimensionando y recolocando con el ratón, pero no podía manejar el aspecto de ese borde a mi gusto, cambiaba en Vista y XP, etc...
Así que el tercer intento fue el de las regiones y como me solucionó los problemas así se queda
Así que timistar, claro que no es problema probar diferentes posibilidades, a veces es necesario para mejorar algún aspecto que no va del todo bien, a veces es para ver si otra cosa que se te ha ocurrido es más eficiente, rápida, elegante, etc... y a veces ¡simplemente es interesante para aprender!
Claro que otra cosa es lo de los mensajes en clave, si cuando escribes estás pensando en otra cosa y sale eso... mejor no pienses en otra cosa. Una cosa es tener la mente abierta y pensar en varias posibilidades para solucionar un problema, eso es genial, pero otra cosa diferente es no concentrarse en lo que se está haciendo y por lo tanto hacerlo mal. Mira esa última frase tuya... hay que leerla 3 veces y no tengo claro haberlo entendido del todo. No soy ninguna lumbrera pero leer sé
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: seleccionar area en una imagen
Jajajaja, no lo miré porque al ver tu post anterior entendí que lo habías solucionado por tu cuenta .Ximorro escribió:Chefito no entiendo cómo te funciona el segundo ejemplo, a mí nada más abrir el formulario se activa un mensaje WM_PAINT, y como el bitmap aún no se ha cargado da error y finaliza el programa ¿a ti no te pasa?
A mi me va perfecto......bueno......perfecto perfecto no . En el ordenador del trabajo me he dado cuenta que falla una cosa. Cuando abrías un archivo imagen para que se cargase en el gui, no lo dibujaba. Tenías que darle un click para ver la imagen. Bueno.......eso ya está solucionado. Un pequeño error técnico con la variable $iclone .
No te debería fallar la función WM_PAINT, ya que dentro solo tiene la función _GDIPlus_GraphicsDrawImageRect y ésta devuelve verdadero o falso.
He inicializado a 0 todas las variables que utilizo para manejar gráficos e imágenes no sea que te falle por esa causa.Ximorro escribió:Ah, ya veo, me parece que es al abrir el formulario, como está registrado WM_PAINT intenta dibujar el bitmap... sólo que como no ha dado tiempo de cargar una imagen ese bitmap aún no existe y el _GDIPlus_GraphicsDrawImageRect falla porque $hGraphic no está asignado.
He dejado la función wm_paint como muestro a continuación:
Código: Seleccionar todo
Func WM_PAINT()
;If $hgraphic Then _GDIPlus_GraphicsDrawImageRect($hGraphic, $iclone, 0, 0, $iWidth, $iHeight)
_GDIPlus_GraphicsDrawImageRect($hGraphic, $iclone, 0, 0, $iWidth, $iHeight)
EndFunc
Código: Seleccionar todo
Func WM_PAINT()
If $hgraphic Then _GDIPlus_GraphicsDrawImageRect($hGraphic, $iclone, 0, 0, $iWidth, $iHeight)
;_GDIPlus_GraphicsDrawImageRect($hGraphic, $iclone, 0, 0, $iWidth, $iHeight)
EndFunc
Si después de todo te sigue fallando........pufffffff.....pues no se chico, se me agotan las ideas, y más encima cuando a mi me va perfecto .
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: seleccionar area en una imagen
Pues efectivamente con el IF funciona. Puede que la función sólo devuelva true o false, pero a parte de devolver algo intenta dibujar, y si $hgraphic no tiene un bitmap me casca.
Quizás tenga que ver con la versión de Windows, versión de la API, etc...
Para no tener que comprobar la variable en cada Paint se puede registrar WM_PAINT únicamente después de haber cargado la imagen, no desde el principio, pero vaya, no hace falta que lo cambies, el objetivo del programa es mostrar cómo dibujar el cuadradito con GDI+ y ya es suficiente.
Quizás tenga que ver con la versión de Windows, versión de la API, etc...
Para no tener que comprobar la variable en cada Paint se puede registrar WM_PAINT únicamente después de haber cargado la imagen, no desde el principio, pero vaya, no hace falta que lo cambies, el objetivo del programa es mostrar cómo dibujar el cuadradito con GDI+ y ya es suficiente.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)