.NET Tutorial 42. XNA simulando luces en un entorno 2D

El efecto que hoy vamos a ver es bastante curioso y puede dar mucho juego a nuestros juegos, valga la redundacia 馃檪

El resultado del efecto es el siguiente:

Como pod茅is observar en el v铆deo (y al ejecutar el tutorial) se simulan varias fuentes de luz. El efecto queda bastante result贸n y puede dar el "pego"en seg煤n que situaciones.

Aqu铆 el "asunto" lo maneja el pixel shader, en concreto este:

texture LightsTexture;
sampler聽 ColorSampler聽 : register(s0);
sampler LightsSampler = sampler_state{
Texture = <LightsTexture>;
};

struct VertexShaderOutput
{
float4 Position : POSITION0;
float2 TexCoord : TEXCOORD0;
};

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
float2 tex = input.TexCoord;

float4 color = tex2D(ColorSampler, tex);
float4 alpha = tex2D(LightsSampler, tex);

return float4(color.r, color.g, color.b, alpha.r);
//para XNA 4.0 usar este return:
//return color * alpha;
}

technique Technique1
{
pass Pass1
{
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}

El shader trabaja con dos texturas, LightTexture y ColorSample y utiliza la componente alpha de la textura de las luces (LightTexture) para devolver el color correcto a la escena

El c贸digo est谩 bastante comentado por lo que no creo que teng谩is excesivos problemas en ver como funciona.

B谩sicamente lo que se hace es:

  • Dibujar el "fondo" en un RenderTarget
  • Dibujar TODAS las "luces" en otro RenderTarget
  • Pasar esas dos texturas al shader
  • El shader se encarga de aplicar los cambios, que es lo que vemos finalmente en la escena

Como ver茅is en los Texture2D que se usan en el Content, el "truco" est谩 en usar correctamente el canal alpha de los distintos sprites que forman nuestra luces.

Yo los he generado con Paint.NET. Supongo que en Gimp o en Photoshop se gener谩n de forma parecida

En Paint.NET el proceso que he seguido es bastante simple: Se genera una nueva imagen con una capa totalmente transparente. En dicha capa selecciono una area, por ejemplo con forma de estrella de cinco puntos. Dicha 谩rea la relleno con un degradado de color blanco con la componente alpha en su valor 0. Finalmente se aplica un filtro gausiano de valor 50 para conseguir el difuminado.

El resultado es algo como esto:聽

Repito, en Gimp o Photoshop el proceso ha de ser similar (no uso esos programas, porque para lo que hago, me sirve y me sobra Paint.NET 馃檪

 

PD 1: Desde aqu铆 quiero agradecer la ayuda prestada por blau y Javi de la XNA Community. 1000 gracias chicos 馃檪

PD 2: El c贸digo est谩 "pensado" para XNA 3.1. Para XNA 4.0 tendr谩s que "experimentar" con el status del Alpha Blending. En "teor铆a" en el shader cambiando una l铆nea (esta comentado en el propio shader) tambi茅n funcionar铆a para XNA 4.0.

Dudas, preguntas, comentarios varios…en el bot贸n de abajo 馃檪

 

Saludos.
mov eax,ollydbg; Int 13h聽聽

Descargar proyecto .NET Tutorial 42
(256 KB. Visual Studio 2008 Professional / XNA GS 3.1)

Descargar binarios del .NET Tutorial 42
(474 KB. Requiere .NET Framework 3.5 / XNA Framework 3.1)聽

 

.NET Tutorial 41. Ocultar la barra de tareas en Windows Vista / Windows 7

En determinadas ocasiones nos puede聽interesar ocultar la barra de tareas de Windows. Esto suele ocurrir b谩sicamente en aplicaciones "a pantalla completa" o tambi茅n conocidas como aplicaciones "kiosko".

Este tipo de aplicaciones est谩n pensadas para que el usuario interaccione con "la pantalla". L贸gicamente no podemos dejar visible la barra de tareas, ya que desde ah铆 pueden acceder al men煤 de inicio, configuraci贸n del sistema, etc.

En Windows XP se pod铆a ocultar autom谩ticamente la barra de tareas. En Vista y 7 tambi茅n se puede:

El problema est谩 en que en Windows Vista / 7, aunque hayamos establecido la propiedad TopMost del formulario a true ocurre que la barra de tareas se visualiza cuando desde nuestra aplicaci贸n ejecutamos otro proceso.

Supongamos la siguiente aplicaci贸n a pantalla completa:


(Haz click para agrandar)

En un determinado聽momento nuestra aplicaci贸n llama a otro proceso, por ejemplo el bloc de notas.

Al ejecutar el bloc de notas ocurre lo siguiente:聽


(Haz click para agrandar)

Como v茅is, el bloc de notas se ha ejecutado, pero al hacerlo, se muestra la barra de tareas de Windows.
Si dejamos que esto ocurra en un "lugar p煤blico" (por ejemplo, tienes la aplicaci贸n en unos grandes almacenes o centro comercial) vete despidiendote del disco duro 馃檪

Con la clase que veremos en este tutorial no se visualizar谩 ni la barr谩 de tareas ni el bot贸n de inicio (orbe) en Windows Vista / 7 cuando llamemos a otro proceso desde nuestra aplicaci贸n:


(Haz click para agrandar)

Para ello聽usaremos una clase聽a la que he llamado TaskBarVista

La clase聽tiene聽dos m茅todos p煤blicos:

  • Show
  • Hide

La clase utiliza las siguientes llamadas a la API de Windows:

  • FindWindow
  • FindWindowEx
  • ShowWindow

Para ocultar/mostrar la barra de tareas usamos la siguiente instrucci贸n:

TaskbarVista.ShowWindow(TaskbarVista.FindWindow("Shell_TrayWnd", ""), IIf(show, SW_SHOW, SW_HIDE))

Para ocultar/mostrar el bot贸n de inicio (orbe) usamos la siguiente instrucci贸n:

TaskbarVista.ShowWindow(TaskbarVista.FindWindowEx(IntPtr.Zero, IntPtr.Zero, System.IntPtr.op_Explicit(&HC017), Nothing), IIf(show, SW_SHOW, SW_HIDE))

En C# las llamadas ser铆an as铆:

//Muestra u oculta la barra de tareas:
IntPtr hwndTaskBar = FindWindow("Shell_TrayWnd", "");
ShowWindow(hwndTaskBar, show ? SW_SHOW : SW_HIDE);

//Muestra u oculta el bot贸n de inicio ("Orbe") (Windows Wista / 7)
IntPtr hwndOrb = FindWindowEx(IntPtr.Zero, IntPtr.Zero, (IntPtr)0xC017, null);
ShowWindow(hwndOrb, show ? SW_SHOW : SW_HIDE);

Dentro de la clase TaskBarVista encontrar茅is tanto el c贸digo para VB.NET c贸mo para C#

 

Saludos.
mov eax,ollydbg; Int 13h聽

 

Descargar c贸digo fuente del .NET Tutorial 41
(18 KB. Visual Studio 2008)

Crear y leer c贸digos QR desde VB.NET

Supongo que muchos de vosotros habr茅is visto en m谩s de una ocasi贸n los c贸digos QR (Quick Response Barcode).

Estos c贸digos de barras actualmente est谩n haciendo "furor" debido a la proliferaci贸n de los dispositivos m贸viles de tipo iPhone y Android.
De hecho, en la Android Market se pueden instalar directamente las aplicaciones en el m贸vil enfocando 茅ste hacia la pantalla del ordenador y "leer" el c贸digo que aparece en la p谩gina:

Gracias al auge de los dispositivos m贸viles de nueva generaci贸n, las cabecezas pensantes de los departamentos de marketing de las empresas no han tardado en ver un fil贸n a todo esto. Se pueden encontrar QR Codes incluso en las marquesinas de las paradas del bus:

…como reclamo publicitario en congresos:

…incluso en latas de refrescos:

 

 

…o en fachadas de edificios:

…y bueno, estos "japos" (con cari帽o eh! 馃檪 son la pera limonera:

Y como no, hasta en CSI Ney York teniendo un trozo de un QR Code pueden saber la identidad del asesino, que n煤mero de calzado usa, si ha comido tallarines el martes pasado o si usa Farmatin para el tinte del pelo:

Nota: En serio, un d铆a tendr茅 que escribir un post sobre CSI New York 馃檪

Hay otra gente que ve posibilidades de negocio en todo esto:

Incluso hay gente que se viste con camisetas con QR Codes, hay gorras, llaveros, etc, y los m谩s freaks en lugar de tat煤arse "letras chinas" ya se tat煤an QR Codes, en fin…que hay gente pa’to 馃檪

Existen otros tipos de c贸digos 2D ampliamente utilizados en la industria. El PDF417 es un est谩ndar "de facto" en la emisi贸n de tarjetas de embarque de las compa帽ias a茅reas de pr谩cticamente todo el mundo, adem谩s se usa tambi茅n en los carnets de conducir de los EE.UU para almacenar informaci贸n acerca del conductor,…

En sucesivos tutoriales cuando tenga algo de tiempo veremos como ser谩 posible generar desde VB.NET c贸digos de tipo Datamatrix y PDF417 o c贸digos lineales tipo CODE-39, EAN-13, CODE-128, etc (Dios bendiga iTextSharp 馃檪

Bueno, al "asunto" 馃檪

Podemos consultar la Wikipedia para tener algo de culturilla general sobre los QR Codes. Es interesante observar que los QR Codes son "libres" y que no se ejerce ninguna patente sobre ellos.

Buscando por internet para documentarme sobre este tipo de c贸digos encontr茅 esta librer铆a desarrollada nativamente en C# por un tal twit88.

La aplicaci贸n que he montado entorno a esta librer铆a (despu茅s de hacer un par de correcciones en el c贸digo C# de la librer铆a: ver comentarios en el link original de la librer铆a) permite tanto generar los c贸digos (Codificar), como tambi茅n leerlos (Descodificar):

Codificando un c贸digo:

Observaciones interesantes:

  • Existen 4 niveles de correcci贸n de errores: 7%, 15%, 25% y 30% .Cuanto mayor es el nivel de correcci贸n m谩s "datos" se meten en el c贸digo para poder descodificarlos correctamente. Esto es 煤til por ejemplo si trabajamos en ambientes "sucios", donde usaremos el mayor nivel de correcci贸n posible (30%). De esta forma, si el c贸digo tiene un "pegote de aceite" se podr铆a descodificar correctamente.
  • Pixel Scale: Cuanto m谩s peque帽o sea el Pixel Scale mas peque帽o ser谩 el QR Code, pero sin embargo necesitaremos un hardware m谩s "complejo y sofisticado" para leerlo.
  • Forzar UTF-8: Esta opci贸n codifica el QR Code para guardar correctamente los car谩cteres "especiales" como por ejemplo puedan ser Espaa, Per, pingino, Bara, etc.

Los c贸digos QR tienen 40 "versiones" (http://www.denso-wave.com/qrcode/vertable2-e.html)
La versi贸n 1 es un cuadro de 21 x 21 "pixels", mientras que la versi贸n 40 es un cuadro de 177 x 177 "pixels"

Una vez generado el c贸digo lo pod茅is guardar en formato *.png, *.jpg, *.bmp o *.gif o incluso imprimirlo.

Para "leer" los c贸digos, cargaremos la imagen y pulsaremos en "Decode". Esto mostrar谩 el resultado en la caja de texto situada debajo de la imagen:

驴Que puedes guardar en un QR Code?

Pues para la versi贸n 40, y con el nivel de correcci贸n m谩s bajo, puedes almacenar hasta 23648 bits (2956 bytes). Esto es casi 3 KB de informaci贸n
La informaci贸n que pongas dentro ya es cosa tuya, puede ser desde una direcci贸n web, de tal forma que cuando el m贸vil lea dicho QR code vaya directamente a dicha p谩gina web, enviar un SMS si pones un texto como este: SMSTO+678xxxxxx:hola esto es una prueba de tal forma que cuando el m贸vil lea dicho QR code env铆e un SMS al telef贸no +678xxxxxx con el texto "hola esto es una prueba,…

El caso es tener imaginaci贸n 馃檪

 

 

Saludos.
mov eax,ollydbg; Int 13h聽

 

Descargar c贸digo fuente del QRCodeVBNET
(974 KB. Visual Studio 2008. Ya incluye la librer铆a pre-compilada de twit88)

Descargar c贸digo fuente del Librer铆a QRCode C# twit88
(1,23 MB. Visual Studio 2008)聽

Tutorial complementario: Crear c贸digos de barras con iTextSharp desde .NET聽


Ollydbg ProSignature

.NET Tutorial 40. Usando el puerto serie (Parte II)

En el Tutorial 31 vimos como simular un dispositivo que enviaba "cosas" por el puerto serie. En aquel tutorial usamos el hyperterminal para verificar que era lo que se estaba enviando.

Hoy veremos la "parte interesante", es decir, realizaremos un programa para poder procesar una comunicaci贸n con un dispositivo serie.

Tal y como vimos en el tutorial anterior tendremos dos posibilidades para realizar las pruebas.

Configuraci贸n 1)

Esto quiere decir que o bien usamos un cable Null-Modem o bien programas para virtualizar puertos (ver tutorial anterior)

En el caso de arriba, el Tutorial 31 utiliza el COM1 y el Tutorial 40 utiliza el COM2.

Configuraci贸n 2)

En este caso tendremos que usar forzosamente un cable Null-Modem.

El tutorial 31 utiliza el COM1 del PC1, mientras que el Tutorial 40 utiliza el COM1 del PC2.

La longitud m谩xima para este tipo de conexiones es de 15 metros.

En el "mundo real" lo que tendremos es esto:

En este caso, ser谩 el fabricante del "cacharro" electr贸nico el que nos indique el patillaje de las conexiones serie. Al igual que antes, el "cacharro" electr贸nico puede estar hasta un m谩ximo de 15 metros del PC que lo controla.

Vistas las imagenes anteriores entiendo que queda bastante claro la funci贸n del Tutorial 31: Como ya dijimos, el Tutorial 31 se encargaba de "s i m u l a r" nuestro cacharro electr贸nico.

Pues bien, sabido todo esto pasemos a la acci贸n.

En mi caso he utilizado la Configuracion 1), utilizando un software para virtualizar puertos serie. En concreto he creado un "par cruzado" formado por los puertos virtuales COM2 y COM3

El Tutorial 31 est谩 usando el COM3, mientras que el Tutorial 40 est谩 usando el COM2

Esto es lo que tenemos al ejecutar los dos tutoriales en paralelo:
(La aplicaci贸n de arriba representa que es el Tutorial 31)

Al "simular" un peso bruto en el Tutorial 31 obtenemos lo siguiente:

Y al simular una tara obtenemos lo siguiente:

En mi aplicaci贸n no quiero que se pesen mas de 60.000 kg. Si simulo un peso superior a los 60.000 kg ocurre esto:

A veces puede ocurrir que por motivos "X", nuestro "cacharro" electr贸nico deja de funcionar (se ha esco帽ado el cable, se ha fundido vete a saber lo que, etc)

Nuestra aplicaci贸n deber铆a tener una "alarma" o algo que nos indicase que no se puede comunicar el nuestro "cacharro" electr贸nico.

En este caso, simular esta situaci贸n es bastante f谩cil. Cerr谩is el puerto en el Tutorial 31 y observamos lo siguiente:

La aplicaci贸n del Tutorial 41 de alguna forma "se entera" que algo est谩 funcionando mal y muestra el mensaje *** Fuera de L铆nea ***

Tambi茅n聽 ocurre que a veces la cosa se arregla sola (vaya Ud. a saber por que motivo 馃檪
Pues desde la situaci贸n anterior, si puls谩is en el bot贸n Abrir del Tutorial 31, autom谩ticamente el Tutorial 40 se "re-engancha" y vuelve a mostrar la informaci贸n:

 

Revisando el c贸digo podr茅is tener una idea aproximada de como realizar todo este control.
El procesado del protocolo es completamente distinto seg煤n el "cacharro" electr贸nico que querramos utilizar.

Nota: Aunque no afecta directamente a la comunicaci贸n en este caso en particular, en la funci贸n AbrirPuerto ( ) donde dice miSerialPort.ReceivedBytesThreshold = 3, deber铆a ser miSerialPort.ReceivedBytesThreshold = 1

Pues con esta entrega concluye de momento esta serie dedicada a la programci贸n con el puerto serie desde .NET

 

Saludos.
mov eax,ollydbg; Int 13h聽

 

Descargar c贸digo fuente del .NET Tutorial 40
(17 KB. Visual Studio 2008)

 

.NET Tutorial 39. Reconocimiento 脫ptico de Car谩cteres (OCR) en .NET

El Reconocimiento 脫ptico de Caracteres (OCR), as铆 como el reconocimiento de texto, en general son aplicaciones dirigidas a la digitalizaci贸n de textos. Identifican autom谩ticamente s铆mbolos o caracteres que pertenecen a un determinado alfabeto, a partir de una imagen para almacenarla en forma de datos con los que podremos interactuar mediante un programa de edici贸n de texto o similar. (wikipedia)

Por si la definici贸n anterior no es demasiado clara, lo explicar茅 con un ejemplo:
Supongamos que nos piden escribir 20 p谩ginas sobre el tratado de Mastrich (ZzzZZZzzz 馃檪
Nosotros que somos la mar de vagos, escaneamos esas 15 p谩ginas de la encicloped铆a Espasa Calpe con lo que tendremos 15 archivos *.jpg (0001.jpg, 0002.jpg, 0003.jpg)

El "problema" es que los archivos "jpg" no se pueden editar en el "Word", cambiarles la fuente, hacer doble espaciado, etc, porque no dejan de ser fotos.

Pues los OCRs lo que hacen es "convertir" esas "fotos" en texto que s铆 es editable.

Otro tipo de OCRs m谩s sofisticados son los que son capaces de "leer" las matr铆culas de los coches, c贸digos de barras, o los captchas de Megaupload ( L o L ??? do_ob )

La "gracia" de los OCRs es que una vez que tienes el "texto", puedes hacer con 茅l lo que quieras, guardarlo en un archivo, procesarlo, usar el Namespace System.Speech o decirle al "loquendo" que lo "hable", etc. El l铆mite lo pones t煤.

En este tutorial utilizaremos el OCR integrando de Office: Microsoft Office Document Library (MODI).
O lo que es lo mismo, para poder ejecutar este tutorial tendr谩s que tener el Office instalado.

El aspecto del tutorial es este:

La parte izquierda es una imagen, sin embargo, en la parte derecha puedes ver el texto de dicha imagen dentro de un TextBox, el cual puedes copiar, pegar, etc.

Aqu铆 otro OCR con otra imagen:

Y aqu铆 con otra:


(Hac click para agrandar)

Las im谩genes que he usado en los ejemplos anteriores son estas:

ocrtest.bmp
ocrtest2.bmp
ocr_sample3.jpg

Los OCRs no son 100% fiables (como todo) y dependen en gran medida de la calidad de la imagen que se est谩 procesando.

Lo primero que deberemos hacer agregar como referencia a nuestro proyecto la librer铆a MODI, que encontraremos en la pesta帽a COM de las referencias:

Nota: Office 2003 instala la versi贸n 11.0, Office 2007 instala la versi贸n 12.0. No he probado versiones superiores del Office. (MODI Wikipedia)

Si est谩s usando un sistema de 64 bits聽 ser谩 necesario compilar el tutorial en modo x86 en lugar de AnyCPU, ya que la librer铆a MODI es nativa de 32 bits.

Una vez agregada la referencia tendremos que importar su Namespace con

Imports MODI

La llamda al OCR es bastante simple:

Dim md As MODI.Document
md = New MODI.Document
md.Create(Imagen)

md.OCR(MiLANGUAGES.miLANG_ENGLISH)

Dim image As MODI.Image = md.Images(0)
Dim layout As MODI.Layout = image.Layout

TextOCR = layout.Text

md.Close()

Es interesante observar que los resultados pueden variar dependiendo del idioma pasado como par谩metro en la funci贸n md.OCR() y del idioma real del documento.
Si el documento al que quieres hacer OCR est谩 en ingl茅s, es recomendable decirle al OCR que "aquello est谩 en ingl茅s". Si no especificas nada en md.OCR() se usar谩 MiLANGUAGES.miLANG_SYSDEFAULT

 

Dudas, preguntas, comentarios varios…en el bot贸n de abajo 馃檪

 

Saludos.
mov eax,ollydbg; Int 13h聽聽

Descargar proyecto .NET Tutorial 39
(20 KB. Visual Studio 2008)

 

.NET Tutorial 38. Cliente Telnet sin librer铆as externas

Por motivos que no vienen al caso he necesitado realizar una comunicaci贸n Telnet, en mi caso particular para comunicarme con un router.
Buscando documentaci贸n por internet encontr茅 diversos componentes "ActiveX" y DLLs que serv铆an para realizar este tipo de comunicaciones.
En la medida de lo posible, os recomiendo "huir" de este tipo de librer铆as e intentar utilizar o bien "librer铆as" en c贸digo nativo de .NET o directamente intentar utilizar las propias clases que nos ofrece el .NET Framework.

Buscando un poco m谩s encotre una clase realizada por un tal Tom Janssens, que utiliza el Namespace System.Net.Sockets.

La clase se llama TelnetConnection y apenas tiene un centenar de l铆neas.

En base a dicha clase me he montado una peque帽a aplicaci贸n para poder enviar "comandos" al router. Pod茅is modificar la aplicaci贸n para realizar vuestros propios cometidos y/o investigar como realizar una comunicaci贸n Telnet.
Hay abundante informaci贸n sobre el protocolo Telnet aqu铆: http://es.wikipedia.org/wiki/Telnet

Os muestro un poco por encima la aplicaci贸n. El c贸digo lo encontrar茅is como de constumbre al final de esta entrada.

Para poder conectarnos a un servidor Telnet, necesitamos la direcci贸n ip (que puede ser num茅rica o bien pepito.dyndns.org), el puerto (que normalmente es el puerto TCP 23), un usuario y una contrase帽a:

Si la conexi贸n con el servidor (en mi caso el servidor Telnet es el router que tiene por IP: 192.168.1.1) es correcta se muestra el mensaje de la pantalla anterior.

Una vez conectados, podemos enviar "comandos" al servidor de Telnet. Normalmente deber铆a existir un comando que es help:

Efectivamente al enviar el comando help el router nos devuelve la lista de comandos que soporta.

Aqu铆 por ejemplo enviamos los comandos version y sysinfo:

Aqu铆 se envi贸 el comando help arp (que como v茅is no existe) y el comando arp –help:

Enviando el comando arp show y la respuesta del router:

Enviando el comando ping www.google.es:

 

En esta ocasi贸n este tutorial solo lo podr茅is probar contra un servidor de Telnet. Si no conoc茅is ninguno pod茅is probar con vuestro router, siempre y claro est谩 que vuestro router tenga un servidor Telnet internamente, que por otro lado, no todos los routers lo tienen.

 

Saludos.
mov eax,ollydbg; Int 13h聽聽

Descargar proyecto .NET Tutorial 38
(18 KB. Visual Studio 2008)

 

Nuevos enlaces descagas Tutoriales

Debido a un problema con el hosting donde ten铆a los archivos de descargas, todos los enlaces hasta el Tutorial 24 incluido se han perdido.

He reagrupado todas las descargas afectadas en este post. Espero que funcionen bien

Os pido disculpas por ello
(…aunque pens谩ndolo bien, solo se ha "quejado" una persona hasta la fecha, por lo tanto, no s茅 que pensar… :S )

 

Saludos.
mov eax,ollydbg; Int 13h聽聽


Nuevos Links de descargas:

Tutorial24.zip (210,56 kb)

Tutorial23.zip (503,28 kb)

Tutorial21.rar (39,30 kb)

Tutorial18.rar (41,33 kb)

Tutorial16.rar (128,51 kb)

Tutorial15.rar (42,35 kb)

Tutorial14.rar (54,92 kb)

AnexoTutorial13.zip (1,24 mb)

Tutorial12.rar (79,77 kb)

Tutorial11.rar (139,92 kb)

Tutorial9parche.rar (143,60 kb)

Tutorial9.rar (143,31 kb)

Tutorial8.rar (110,23 kb)

Tutorial7.rar (70,18 kb)

TetrisNET_Parte3.rar (89,60 kb)

TetrisNET_Parte2.rar (85,25 kb)

TetrisNET_Parte1.rar (70,63 kb)

Tutorial6.rar (565,71 kb)

Tutorial5.rar (45,18 kb)

Tutorial4.rar (67,10 kb)

Tutorial3.rar (144,15 kb)

Tutorial2.rar (146,61 kb)

Tutorial1.rar (73,51 kb)

Otras descargas afectadas (Mis programas):

OllySecrets_v2.zip (63,86 kb)

OllySecrets.zip (57,13 kb)

PingScanner.zip (9,03 kb)

MouseOdometerNET.zip (40,12 kb)

MouseOdometerNET_source.zip (91,58 kb)

 

.NET Tutorial 37. Creando Thumbnails por c贸digo

En el tutorial de hoy veremos como ser谩 posible "redimensionar" una imagen para conseguir determinados efectos.
Estas transformaciones se hacen mediante la GDI del .NET Framework.
En el NameSpace System.Drawing.Image hay un m茅todo llamado GetThumbnailImage que genera una vista en miniatura.聽

El "problema" del m茅todo GetThumbnailImage son sus par谩metros: Es necesario usar dos "callbacks", uno para llamar al m茅todo GetThumbnailImageAbort y otro callback a un puntero, que debe ser System.IntPtr.Zero

Los m茅todos mostrados aqu铆 realizar谩n lo mismo pero sin el engorro de utilizar "callbacks". Los m茅todos los he encapsulado en una clase llamada Thumbnail. Dicha clase tendr谩 4 funciones publicas que realizar谩n las transformaciones de las im谩genes tal y como veremos a continuaci贸n.

Estas 4 funciones devuelven un objeto de tipo Bitmap. Si no se pudo realizar la operaci贸n se devuelve Nothing.
Con el objeto Bitmap devuelto podr谩s hacer lo que quieras. En el caso particular de este tutorial se usa el objeto Bitmap devuelto para cargar la propiedad .Image de un PictureBox, que es el que muestra el resultado.

El aspecto de este tutorial es el siguiente:

Lo primero que tendremos que hacer ser谩 cargar la imagen que querramos "tratar" mediante el bot贸n Imagen.
Una vez cargada la imagen se mostrar谩 las dimensiones reales de dicha imagen (Ancho y Alto)

La primera funci贸n de la clase es:

ResizePicture_MatrixByScale ( Fichero, Escala )

Este m茅todo utiliza la matriz de transformaci贸n aplicando una escala al objeto.
Valores de escala < 1 reducir谩n la imagen
Valores de escala > 1 aumentar谩n la imagen

En el ejemplo se usa el valor 0.39:

Como puedes ver, el tama帽o resultante es de [363 x 578] pixels. Esto se supone que es la reducci贸n hasta un 39% del tama帽o original [930 x 1483]

La siguiente funci贸n es:

ResizePicture_MatrixByWidth ( Fichero, Ancho )

Aqu铆 tambi茅n se usa la matriz de transformaci贸n:

A veces nos puede interesar crear "imagenes" en miniatura donde todas tengan el mismo "ancho".
Esta funci贸n asegura el ancho pasado como par谩metro y calcula el alto necesario para mantener el mismo "aspect-ratio". De esta forma la "miniatura" no sale deformada.

En el ejemplo anterior se ve que para una imagen original de [930 x 1483] pixels, al pedir una "miniatura" de un acho fijo de 120 pixels, la altura correcta debe ser de 191 pixels

En la clase tambi茅n existe la funci贸n complementar铆a:

ResizePicture_MatrixByHeight ( Fichero, Alto )

Al igual que en el caso anterior, quiz谩s nos interese que todas las "miniaturas" tengan el mismo alto:

En este caso, la funci贸n calcula el ancho necesario para la imagen en funci贸n del alto que se ha especificado en el par谩metro de la funci贸n. As铆, para una imagen de un tama帽o original de [930 x 1483] pixels si la "miniatura" tiene que tener forzosamente un alto de 80 pixels, la funci贸n obtiene que el acho debe ser de 50 pixels.

De esta forma, al igual que antes se sigue manteniendo el "aspect-ratio" y la "miniatura" no sale deformada.

La 煤ltima funci贸n de la clase es la siguiente:

MakeThumbnail_FixedSize ( Fichero, Ancho, Alto, Color )

En determinadas ocasiones tendremos que poner una determinada imagen en un "PictureBox" de un tama帽o fijo. Esta funci贸n asegura el correcto "aspect-ratio", independientemente de la orientaci贸n de la imagen original (vertial u horizontal) y del tama帽o expresado en los par谩metros Ancho y Alto.

Esta funci贸n "ajusta" la miniatura resultante al tama帽o formado por Ancho x Alto

Adem谩s se puede especificar el color con el cual se rellenar谩n las partes "sobrantes" en el recuadro formado por Ancho x Alto. Se puede especificar el color Color.Transparent si lo deseamos

El resultado en este caso:

La imagen original es "vertical" (es mucho m谩s alta que ancha). Sin embargo hemos especificado que el tama帽o de la miniatura es de 120 x 80 pixels. 120 x 80 genera un cuadrado "horizontal" (es m谩s ancho que alto)

Como v茅is, la funci贸n genera la imagen y la "centra" autom谩ticamente dentro del cuadro delimitado por Ancho x Alto. El resto del 谩rea lo pinta de rojo (en este caso)

 

Dudas, preguntas, comentarios varios…en el bot贸n de abajo 馃檪

 

Saludos.
mov eax,ollydbg; Int 13h聽聽

Descargar proyecto .NET Tutorial 37
(17 KB. Visual Studio 2008)