Como generar imagenes en ASP.net

Hoy estoy prolifico. O no tengo ganas de hacer nada más.
 
Una de las cosas que me rompió la cabeza cuando empecé a trabajar con ASP (No .Net), era encontrar imágenes donde su origen de datos era algo así: MiPagina.ASP?ImagenID=23848
 
Finalmente comprendí que esta página retornaba la imagen, básicamente transformándose en esta. O sea, en vez de ser un texto con HTML, era un archivo binario con el contenido de la imagen.
 
Lo mismo, puede ser realizado en .Net, así que aquí les va el código de esta página, la cual retorna imágenes basadas en los estilos de rellenos de windows.
 
Como aclaración, la página en si, o sea, el HTML, no debe contener ningún tag HTML, ni espacios, de esta forma nos aseguramos que el resultado será esta imagen, y no algún caracter extraño.
 
La página en cuestión, necesita de un par de parametros, los cuales deben ser pasados por GET.
 
Estos son:
  • Style; El estilo del enumerado HatchStyle
  • Color1; En formato Win32
  • Color2; En formato Win32
Espero que les sirva.
 

Imports

System.Drawing

Imports

System.Drawing.Imaging

Imports System.Drawing.Drawing2D

Public

Class GenerateComboBars

   Inherits System.Web.UI.Page

   Private

Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

      Dim lngWidth As Long

      Dim lngHeight As Long

      Dim Color1 As Long

      Dim Color2 As Long

      Dim lngFillStyle As Long = 0

      lngHeight = 20

      lngFillStyle =

CLng(Request.QueryString("Style"))

      Color1 = Request.QueryString("Color1")

      Color2 = Request.QueryString("Color2")

      lngWidth = 20

      Dim b As New System.Drawing.Bitmap(lngWidth, lngHeight, PixelFormat.Format16bppRgb555)

      Dim g As Graphics = Graphics.FromImage(b)

      Select Case lngFillStyle

         Case 1

            ‘Gradient Fill

            g.Clear(ColorTranslator.FromWin32(Color1))

            g.SmoothingMode = SmoothingMode.AntiAlias

‘ antialias objects

            g.FillRectangle(

New LinearGradientBrush(New Point(0, 0), New Point(b.Width, b.Height), ColorTranslator.FromWin32(Color1), ColorTranslator.FromWin32(Color2)), 0, 0, b.Width, b.Height)

         Case 2

            ‘Thin Thatch

            g.Clear(ColorTranslator.FromWin32(Color1))

            g.SmoothingMode = SmoothingMode.AntiAlias

‘ antialias objects

            Dim hBrush1 As HatchBrush = New HatchBrush(HatchStyle.Percent20, ColorTranslator.FromWin32(Color1), Color.White)

            g.FillRectangle(hBrush1, 0, 0, b.Width, b.Height)

         Case 3

            ‘Medium Thatch

            g.Clear(ColorTranslator.FromWin32(Color1))

            g.SmoothingMode = SmoothingMode.AntiAlias

‘ antialias objects

            Dim hBrush1 As HatchBrush = New HatchBrush(HatchStyle.Percent25, ColorTranslator.FromWin32(Color1), Color.White)

            g.FillRectangle(hBrush1, 0, 0, b.Width, b.Height)

         Case 4

            ‘Thick Thatch

            g.Clear(ColorTranslator.FromWin32(Color1))

            g.SmoothingMode = SmoothingMode.AntiAlias

‘ antialias objects

            Dim hBrush1 As HatchBrush = New HatchBrush(HatchStyle.Percent30, ColorTranslator.FromWin32(Color1), Color.White)

            g.FillRectangle(hBrush1, 0, 0, b.Width, b.Height)

         Case 5

            ‘Back Diagonal Lines

            g.Clear(ColorTranslator.FromWin32(Color1))

            g.SmoothingMode = SmoothingMode.AntiAlias

‘ antialias objects

            Dim hBrush1 As HatchBrush = New HatchBrush(HatchStyle.ForwardDiagonal, ColorTranslator.FromWin32(Color1), Color.White)

            g.FillRectangle(hBrush1, 0, 0, b.Width, b.Height)

         Case 6

            ‘Forward Diagonal Lines

            g.Clear(ColorTranslator.FromWin32(Color1))

            g.SmoothingMode = SmoothingMode.AntiAlias

‘ antialias objects

            Dim hBrush1 As HatchBrush = New HatchBrush(HatchStyle.BackwardDiagonal, ColorTranslator.FromWin32(Color1), Color.White)

            g.FillRectangle(hBrush1, 0, 0, b.Width, b.Height)

         Case 7

            ‘Diagonal Cross Lines

            g.Clear(ColorTranslator.FromWin32(Color1))

            g.SmoothingMode = SmoothingMode.AntiAlias

‘ antialias objects

            Dim hBrush1 As HatchBrush = New HatchBrush(HatchStyle.DiagonalCross, ColorTranslator.FromWin32(Color1), Color.White)

            g.FillRectangle(hBrush1, 0, 0, b.Width, b.Height)

         Case 8

            ‘Vertical Lines

            g.Clear(ColorTranslator.FromWin32(Color1))

            g.SmoothingMode = SmoothingMode.AntiAlias ‘ antialias objects

            Dim hBrush1 As HatchBrush = New HatchBrush(HatchStyle.LightVertical, ColorTranslator.FromWin32(Color1), Color.White)

            g.FillRectangle(hBrush1, 0, 0, b.Width, b.Height)

         Case 9

            ‘Horizontal Lines

            g.Clear(ColorTranslator.FromWin32(Color1))

            g.SmoothingMode = SmoothingMode.AntiAlias ‘ antialias objects

            Dim hBrush1 As HatchBrush = New HatchBrush(HatchStyle.LightHorizontal, ColorTranslator.FromWin32(Color1), Color.White)

            g.FillRectangle(hBrush1, 0, 0, b.Width, b.Height)

         Case 10

            ‘Cross Lines

            g.Clear(ColorTranslator.FromWin32(Color1))

            g.SmoothingMode = SmoothingMode.AntiAlias

‘ antialias objects

            Dim hBrush1 As HatchBrush = New HatchBrush(HatchStyle.Cross, ColorTranslator.FromWin32(Color1), Color.White)

            g.FillRectangle(hBrush1, 0, 0, b.Width, b.Height)

         Case Else

            g.Clear(ColorTranslator.FromWin32(Color1))

            g.SmoothingMode = SmoothingMode.AntiAlias

‘ antialias objects

      End Select

      Response.ContentType = "image/Jpeg"

      b.Save(Response.OutputStream, ImageFormat.Jpeg)

      b.Dispose()

   End Sub

End

Class

Anuncios

Winsock para .Net

Una de las cosas que siempre me han gustado es la transferencia de datos por medio de la red. No necesariamente la descarga de MP3 , si no, el poder crear código para que dos aplicaciones se conecten entre si, y dialoguen.
 
Así fue que llegue a conocer el control WinSock en Visual Basic, del cual me enamore, e hice con él, todo tipo de aplicaciones.
 
El punto esta en que pasando a .Net, no encontre este control, asi que me puse manos a la obra para crear una clase que haga mas o menos lo mismo.
 
Y aquí está. Esta clase es parte de una aplicación hecha para Pocket PC. La aplicación es un juego de ajedrez, que entre sus funciones, puede ser jugado entre dos Pockets por medio de una aplicacion intermedia, la cual sería el servidor de datos de los juegos.
 
En definitva, aquí va la clase.
 

Imports

System.Net.Sockets

Imports

System.Text

Public Class Socket

   Private oSocket As New TcpClient

   Private oNetStream As NetworkStream

   Private _strServer As String

   Private _lngPort As Long

   Private _blnActiveConnection As Boolean = False

 

   Public Event SocketRespond(ByVal Response As String)

 

   Public WriteOnly Property ServerName() As String

      Set(ByVal Value As String)

         _strServer = Value

      End Set

   End Property

 

   Public WriteOnly Property Port() As Long

      Set(ByVal Value As Long)

         _lngPort = Value

      End Set

   End Property

 

   Public Sub SendData(ByVal strData As String)

      Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes(strData)

      oNetStream.Write(sendBytes, 0, sendBytes.Length)

   End Sub

 

   Public Sub CloseConnection()

      _blnActiveConnection =

False

   End Sub

 

   Public Sub Listen()

      Try

         oSocket.Connect(_strServer, _lngPort)

         oNetStream = oSocket.GetStream

         _blnActiveConnection =

True

         Do While _blnActiveConnection

            If oNetStream.CanRead Then

               If oNetStream.DataAvailable Then

                  Dim strData As String

                  Dim ReadBytes(oSocket.ReceiveBufferSize) As Byte

                  Dim lngTotalBytes As Integer = oSocket.ReceiveBufferSize

                  oNetStream.Read(ReadBytes, 0, lngTotalBytes)

                  strData = Encoding.ASCII.GetString(ReadBytes, 0, lngTotalBytes)

                  RaiseEvent SocketRespond(strData)

               End If

            End If

            Application.DoEvents()

         Loop

         _blnActiveConnection = False

         oNetStream.Close()

         oSocket.Close()

      Catch ex As SocketException

         Throw ex

      End Try

   End Sub

End

Class


Catarsis

Hace tiempo que no escribo nada, y ese mismo tiempo estuve pensando que escribir, así llegué a la conclusión que necesitaba poner algo de mi, como para cambiar un poco la cara, lavarla, refrescarla. Siempre tocando temas relacionados a la informática, por lo que tenía que decir algo diferente.

 

Por más que lo intenté, no hubo manera, la informática esta en mis venas, por este hecho es que les contaré un poco del como empezó mi vida en este mudo que ya empieza a mostrar sus estragos, con las primeras tempranas canas en mi cabeza.

 

¿Cuando empezó?

 

Existe un punto en la vida donde debes optar por un camino. Desde muy chico, puedo decir desde que tengo memoria que tenía memoria, o sea, a eso de los 5 años de edad, tenía una idea fija, yo, quería ser veterinario. No había forma que alguien me sacara de la cabeza esta idea, incluso años más tarde, como unos 11 mas tarde, trabajé en una veterinaria, pero no nos desviemos del tema.

 

El punto es, cuando empecé con esto, con la informática, aunque no sea necesariamente el momento cuando me decidí definitivamente por la informática, pero podemos situar este momento en mi sexto cumpleaños (Sí, a los 6 años), cuando corrí con mi padre a la única tienda de tecnología del pueblo (Digamos tecnología, a un lugar donde vendían calculadoras y relojes), para adquirir un ordenador. Debo reconocer que el nombre del mismo escapa por completo a mi memoria, pero no sus características.

  • 2 KB de memoria
  • Cartucho de expansión para 16 KB
  • Carga de software por medio de casetes

En definitiva, una monstruosidad para su época, hablamos del año 1983. La ventaja de esta maravilla tecnológica era que traía un manual completo del lenguaje de programación con el cual podrías hacer tus programas (De 2 KB). Aunque a esta temprana edad solo había aprendido a conectar el aparato al televisor, escribir LOAD para comenzar la carga de un programa, y apretar el triangulo del pasa casetes para que la cinta comenzara a girar, y así, poder jugar un simple juego donde un cero caía desde la parte superior de la pantalla y desde el otro extremo debíamos lanzar un disparo para que impacte con este.

Aunque pase un tiempo jugando, la tecnología seguía adelante, y mi ordenador sin nombre se convirtió, a los 2 años en un hermoso Sinclair Spectrum de asombrosos 48 KB de memoria, y una vez más, acompañado de un estupendo manual con el lenguaje de programación incluido.

A estas alturas, con 8 años de edad, deje de jugar (un poco) para comenzar con el traspaso del código de ejemplo del manual al ordenador, tratando de entender que y porque hacía lo que hacía. Debo aclarar que el manual estaba en perfecto castellano, por lo que, aprender el lenguaje resultaba medianamente fácil.

A todo esto, el único centro de capacitación en el pueblo, dejo de lado la enseñanza de la tan necesaria taquigrafía, por un curso piloto de desarrollo de software. El cual se produciría en otras estupendas máquinas, las Commodore 64.

Como era de esperarse, o mejor dicho, como muy pocos sabían que era un Commodore 64, y más aún, algunos no sabían que era un reloj digital, no había otra opción que yo, a mis 8 años de edad, tomara el curso. El curso paso sin pena ni gloria, con esto quiero decir que para un niño de 8 años, posiblemente estaba mas preocupado por el último capitulo de Hi-Man, y no tanto por darle a las teclas. Aunque la nota final fue 7 sobre 10, nada mal.

De cualquier manera, yo quería ser veterinario, pero puedo afirmar que mi pasión por la informática comenzó en este momento, o mejor dicho, fue el momento en el cual elegí uno de los caminos.

El lado oscuro.

Como todo en la vida, siempre hay un momento de oscuridad, donde el protagonista se ve inmerso en una nube densa que lo aleja del objetivo primordial.

Después de la Spectrum, vino la primer PC XT, pantalla monocromática, 640 KB de memoria, disco flexible de 5 1/4, y tantas cosas para hacer con este tremendo avance.

Mi momento oscuro fueron los que viví con esta evolución, desde el XT al AT, al 2×86, al 3×86, hasta el sucesor inmediato.

Oscuro, debido a que, posiblemente podría haber aprovechado ese tiempo para interiorizarme mas en los lenguajes de programación, aunque lo intenté, con DBase, pero prefería jugar juegos con los amigos. Tengamos en cuenta que yo, sí, quería ser veterinario.

De cualquier manera, en toda oscuridad siempre hay algo de luz, por lo que este tiempo no fue del todo desaprovechado, ya que, muchas veces cansado de los mismos juegos, y el no tener nada más adelante que el sistema operativo, o el mismo juego aburrido, no quedaba otra alternativa que empezar a ver que había adentro de esos archivos con extensión COM, o EXE, o SYS.

Esto me llevó a utilizar herramientas que leían el código de estos archivos, transformándolo a hexadecimal, para hacer, finalmente una interpretación en ASCII del mismo. Debo decir, y espero que nadie se enoje, que las versiones de MS-DOS, no era de propiedad de Microsoft, como tampoco se llamaba MS-DOS, hasta el punto de que el comando DEL, o DELETE no era tal, si no que se había transformado en BORRAR, o que los juegos, en sus presentaciones, no habían sido programados por sus autores, si no por mi.

 

La resolución.

 

Después de divagar durante el mundo oscuro, vi la luz, o por lo menos, opte por la senda que ya había tomado 10 años atrás. Cuando en las puertas de la universidad, tengo la posibilidad de hablar con el rector de la misma, el cual era veterinario. Después de una larga conversación, me aconseja que no siga sus pasos, si no los míos.

Quería contarles esto, ya que estoy, prácticamente, celebrando mis 20 años en el área, ya que a mis 28 años me doy cuenta que, por mas que las canas ya se vean, fue una de las mejores elecciones que he hecho en mi vida.


Exito total…

Supongo que el éxito de algo depende de que tan dentro o por encima de los parámetros estuvo.

 

En este caso, creo que supero todas las expectativas.

 

¿De que hablo? Fácil, de la primer conferencia a la inversa. De este intercambio de conocimientos planteado hace unas semanas atrás, donde el orador solo estaba para aclarar dudas, y ellos, los que siempre nos siguen y nos aguantan, estaban para hablarnos, decirnos sus problemas, y buscar una solución.

 

Debo reconocer que al principio, estábamos un poco asustados, pensábamos que sería un fracaso, ya que, sobre la hora de inicio, solo había 4 personas, pero, sin darnos cuenta, el salón se llenó.

 

Teníamos una estructura planificada, meticulosa, con una presentación lista por si nadie lanzaba la primer pregunta. El tema, ADO.net, por suerte, o porque así lo querían los espectadores (O sea, nosotros), salió la primer pregunta, seguida de otra, y otra, y otra.

 

Creo que de lo que menos se habló fue de ADO.net, y justamente, esa era la idea, dejar que las dudas salgan, que la gente se libere, que pierdan el miedo.

 

Sin darnos cuenta, pasaron 2 horas, entre risas, explicaciones en el pizarrón, paginas webs y código.

 

Aunque creo que lo mas interesante e importante, fueron los últimos 15 minutos, donde por parte de los presentes, empezaron a saltar iniciativas, pidiendo hacer más por la comunidad, organizar grupos de ayuda a otros programadores, crear proyectos modelos, hacer más de este tipo de conferencias.

 

En definitiva, el piloto fue un éxito, y esperemos que los próximos estén mejor aun.