seleccionar area en una imagen

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Avatar de Usuario
timistar
Hacker del Foro
Mensajes: 89
Registrado: 24 Jun 2008, 05:03

seleccionar area en una imagen

Mensaje por timistar »

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
Avatar de Usuario
timistar
Hacker del Foro
Mensajes: 89
Registrado: 24 Jun 2008, 05:03

Re: seleccionar area en una imagen

Mensaje por timistar »

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

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

Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: seleccionar area en una imagen

Mensaje por Ximorro »

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 :smt003
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
timistar
Hacker del Foro
Mensajes: 89
Registrado: 24 Jun 2008, 05:03

Re: seleccionar area en una imagen

Mensaje por timistar »

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


:smt041 :smt041 :smt041
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: seleccionar area en una imagen

Mensaje por Ximorro »

¿Un instalador? ¡¡Sólo hay que copiar el EXE donde lo quieras!! :smt003
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)
Avatar de Usuario
timistar
Hacker del Foro
Mensajes: 89
Registrado: 24 Jun 2008, 05:03

Re: seleccionar area en una imagen

Mensaje por timistar »

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
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: seleccionar area en una imagen

Mensaje por Ximorro »

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! :smt003 :smt005 :smt003 :smt005 :smt003 :smt005

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 :smt044
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: seleccionar area en una imagen

Mensaje por Chefito »

Juer chavales....que usuarios más desconfiados :smt005 .
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 :smt003 .

Bueno....cuestión de gustos :smt002 .

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
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 :smt005 . 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 :smt024 .

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 ;).
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: seleccionar area en una imagen

Mensaje por Chefito »

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 :smt005 ), 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:

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
Coger el que más os guste :smt002 .

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 ;).
Avatar de Usuario
timistar
Hacker del Foro
Mensajes: 89
Registrado: 24 Jun 2008, 05:03

Re: seleccionar area en una imagen

Mensaje por timistar »

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


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


Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: seleccionar area en una imagen

Mensaje por Chefito »

Mmmmmm. Antes de nada procura escribir mejor que parte de tus mensajes a veces no se entienden nada :smt012 .
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 sabía que habría ese problema. Esto era un ejemplo de como se podía hacer, no un script entero.
Ya he hecho demasiado creando un recuadro a medida, el cual no se sale de la ventana y otros errores corregidos.
timistar escribió:mirame a ver si puedo adaptar una funcion de escalarla a tu codigo
Solo decirte que lo intentes tú.
Te aseguro que yo puedo adaptar eso y más (por lo menos en este caso) pero el script lo acabaría haciendo yo :smt011 .
Intentala adaptar tú a ver si puedes hacer algo. Si no te sale pon el código aunque esté erroneo y te intentaremos ayudar.
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
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 :smt002 .

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 :smt012 . Y peor aun, yo no lo guardé :smt012 , y no tengo ganas de hacerlo denuevo :smt005 . 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 :smt024 . 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 :smt040 . O en porcentaje, una simple multiplicación :smt003 .

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 ;).
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: seleccionar area en una imagen

Mensaje por Ximorro »

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 ;-)
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: seleccionar area en una imagen

Mensaje por Chefito »

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.
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 :smt033 . El que quiera mejoras ya sabe.....a currarselo.
Ximorro escribió:De todas maneras me parece más fácil el que hice yo con los agujeros
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 :smt002 ). Aunque como siempre digo, si funciona bien para lo que quieres, bien hecho está :smt005 .

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 ;).
Avatar de Usuario
timistar
Hacker del Foro
Mensajes: 89
Registrado: 24 Jun 2008, 05:03

Re: seleccionar area en una imagen

Mensaje por timistar »

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 :smt041

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
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: seleccionar area en una imagen

Mensaje por Ximorro »

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é :smt003
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: seleccionar area en una imagen

Mensaje por Chefito »

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?
Jajajaja, no lo miré porque al ver tu post anterior entendí que lo habías solucionado por tu cuenta :smt003 .
A mi me va perfecto......bueno......perfecto perfecto no :smt005 . 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 :smt005 .

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.
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 inicializado a 0 todas las variables que utilizo para manejar gráficos e imágenes no sea que te falle por esa causa.

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
Si después de todo aun te sigue fallando el código, quita el comentario de la primera y comenta la segunda:

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
No lo he puesto así desde el principio para evitarme una comparación :smt003 .

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 :smt016 .

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 ;).
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: seleccionar area en una imagen

Mensaje por Ximorro »

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.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder