¿Cómo convertir una imagen de formato RGB a CMYK en c# .Net?

Hace poco termine unos proyectos en los cuales debía manejar la manipulación de imágenes enormes, y me encontré con mucha problemática y poca información, pero gracias a muchas desveladas conseguí el objetivo.
Uno de mis quebraderos de cabeza fue el transformar una imagen de formato RGB a formato CMYK, y hacer de una manera que sea gratuita (ya que encontré algunas empresas que vendían dlls a precios descabellados).

Si van a manipular imágenes enormes, ahórrense martirios y horas de trabajo demás, NO UTILICEN System.Drawing, la misma documentación de Microsoft no recomienda que lo utilices para proyectos con manipulación de imágenes grandes.

Ahora que ya resolví este problema publico este post que a más de uno le servirá, primero vamos a tener que instalar un dll que es gratuito (prácticamente es un wrapper hecho en c++), este magnífico dll se llama Magick.Net. Solo destacare que hay varios dlls con este nombre, lo que los diferencia es que tienen un numero al final, entre sea más elevado el número, se puede trabajar con imágenes mayores, descarguen según les convenga (si utilizaran imágenes enormes les recomiendo que bajen Q16 de 64 bits).
Si no sabes cómo instalar un dll por medio de nuget da clic aquí y te explico con un video como hacerlo.
Una vez que instalamos Magick.Net (otro problema que me encontré es la falta de ejemplos para .Net) vamos a crear la imagen CMYK. Para ellos lo haremos de la siguiente manera:


using(MagickImage image = new MagickImage("miimagenRGB.jpg")){
                        //lineas magicas que convierten a CMYK
                        image.AddProfile(ColorProfile.SRGB);
                        image.AddProfile(ColorProfile.USWebCoatedSWOP);

                        //y si guardamos nuestra imagen cmyk
                        image.Write("imagenCMYK.jpg");
}

Así de fácil se resuelve un problema en el cual estuve investigando casi por un mes (sorpresas de la vida del programador).
Más adelante iré agregando más artículos sobre esta potente librería.

Código gratis, sistema para gimnasio en C# .Net – Gym Hdeleon

Deseas más funcionalidad, ya salio la nueva versión de este sistema para administrar gimnasios, incluye registro con huella, administración de clases, Soporte para puerta eléctrica, membresias semanales,  indice de masa coorporal y más, puedes ver la información aquí.

La descripción del gimnasio ya compilado la hago en el siguiente video:

Si deseas este software en ingles da clic aquí.

No damos soporte de esta versión, ya que es la versión gratuita.

Existe una versión premium con costo con muchísimas más funcionalidades, puedes verla dando clic aquí.

Descargar sistema y código para gimnasio 1.0 GRATIS

Versión 1.0 en ingles, puedes acceder a la versión en ingles la cual también es gratuita (incluye código fuente).

IR A TUTORIAL PARA INSTALAR EL SOFTWARE (PARA PERSONAS QUE NO SABEN DE PROGRAMACIÓN)

Cualquier duda no duden en hacérmela en la parte de comentarios.

Consulta para obtener comentarios de una base de datos en #Mysql – diccionario de datos

Algunas veces es necesario obtener los comentarios ingresados en las columnas en una base de datos (diccionario de datos). Sobre todo cuando llevamos una buena .

Aquí anexo un script que sirve para obtener los comentarios de una base de datos en particular:


select table_name,column_name,data_type,COLUMN_COMMENT from information_schema.columns
where table_schema = 'nombreDeLaBD'
order by table_name,ordinal_position

Ya solo es cuestión de remplazar “nombreDeLaBd” por tú base de datos y listo.

Corregir el error “in a frame because it set ‘X-Frame-Options’ to ‘SAMEORIGIN’” en #MVC .Net

MVC .Net por defecto no permite que sea visto en un iframe, pero a veces surge la necesidad de que sea visto en un iframe (o en mi caso el hospedaje invocaba un iframe el cual cargaba el sitio, no sé porque diablos así lo hace).

Para permitir que MVC .Net permita ser cargado en un iframe debemos ir al archivo Global.asax.cs y en el método Application_Start() debemos agregar la siguiente línea:

AntiForgeryConfig.SuppressXFrameOptionsHeader = true;

A su vez debemos agregar el namespace: System.Web.Helpers

Con esto se soluciona el problema. Espero les ahorre dolores de cabeza.

¿Cómo obtener los dispositivos usb en c#?

Para obtener los dispositivos USB que tiene nuestra computadora en c# vamos a hacer uso de la librería System.Management, esta librería debemos agregarla en las referencias de nuestro proyecto y al inicio de nuestra clase (using System.Management).

La siguientes dos clases hacen el trabajo y esta comentado que hace cada parte:

Clase para guardar la información de los dispositivos


/// <summary>
/// clase para guardar las especificaciones de los dispositivos
/// </summary>
  public class USBInfo
  {

    //constructor
    public USBInfo(string deviceID, string pnpDeviceID, string description)
    {
      this.DeviceID = deviceID;
      this.PnpDeviceID = pnpDeviceID;
      this.Description = description;
    }

    /// <summary>
    /// Device ID
    /// </summary>
    public string DeviceID { get; private set; }

    /// <summary>
    /// Pnp Device Id
    /// </summary>
    public string PnpDeviceID { get; private set; }

    /// <summary>
    /// Descripción del dispositivo o nombre
    /// </summary>
    public string Description { get; private set; }
  }

Clase que se encarga de obtener los dispositivos


 public class Usb
    {

        /// <summary>
        /// obtiene las usb de la computadora
        /// </summary>
        /// <returns></returns>
        public List<USBInfo> GetUSBDevices()
        {

          //creamos una lista de USBInfo
          List<USBInfo> lstDispositivos = new List<USBInfo>();

          //creamos un ManagementObjectCollection para obtener nuestros dispositivos
          ManagementObjectCollection collection;

          //utilizando la WMI clase Win32_USBHub obtenemos todos los dispositivos USB
          using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))

          //asignamos los dispositivos a nuestra coleccion
         collection = searcher.Get();

          //recorremos la colección
          foreach (var device in collection)
          {
            //asignamos el dispositivo a nuestra lista
            lstDispositivos.Add(new USBInfo(
            (string)device.GetPropertyValue("DeviceID"),
            (string)device.GetPropertyValue("PNPDeviceID"),
            (string)device.GetPropertyValue("Description")
            ));
          }

          //liberamos el objeto collection
          collection.Dispose();
          //regresamos la lista
          return lstDispositivos;
        }
     }

Y de esta manera hacemos uso de nuestra clase USB:


Usb oUsb = new Usb();
List<USBInfo> lstUSBD = oUsb.GetUSBDevices();

¿Cómo agregar autoincrement a una llave primaria cuando ya está relacionada a otras tablas? #mysql #constraint #foreign

Cuando tenemos una llave primaria la cual está relacionada a otras tablas y deseamos ponerla como autoincrement (ya sea porque se nos pasó en el diseño o por x circunstancia), debemos poner el valor 0 a la variable de mysql FOREIGN_KEY_CHECKS y para ello lo podemos hacer de la siguiente manera:

SET FOREIGN_KEY_CHECKS = 0;

Y para volverla a activar:

SET FOREIGN_KEY_CHECKS = 1;

Y así nos quedaría nuestra instrucción completa, incluyendo la consulta que hace la llave primaria que se autoincremente:


SET FOREIGN_KEY_CHECKS = 0;

ALTER TABLE `nombreTabla`
MODIFY COLUMN `idTabla`  int(11) NOT NULL AUTO_INCREMENT;

SET FOREIGN_KEY_CHECKS = 1;

¿Cómo hacer que el middleware VerifyCsrfToken de #Laravel nos ignore rutas específicas?

Algunas veces tenemos la necesidad de que el middleware VerifyCsrfToken ignore rutas específicas, ya sea por una petición en la cual no enviemos el token o ya sea por utilizar algún framework externo a Laravel, para eso solo basta con ir al middleware VerifyCsrfToken y agregar en el arreglo $except las rutas deseadas:

namespace AppHttpMiddleware;

use IlluminateFoundationHttpMiddlewareVerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        //
    	'ruta/pato',
        'ruta2/pato2'
    ];
}

Cambiar una imagen al dar clic en una imagen en miniatura con #jquery, #galería

Para crear una mini galería básica como la siguiente (den clic en las miniaturas):

Lo podemos hacer de la siguiente forma:

HTML

<div id="thumbs">
   <img style="width: 50px;" alt="" src="../img/images/at.jpg" data-img="../img/images/a.jpg" />
   <img style="width: 50px;" alt="" src="../img/images/bt.jpg" data-img="../img/images/b.jpg" />
</div>

<div>
    <img id="imagenGrande" style="width: 500px;" alt="" src="../img/images/a.jpg" />
</div>

Jquery

$(document).ready(function(){

	//selector de imagenes a aplicar la funcionalidad de click
	$("#thumbs img").click(function(){

		//obtenemos la imagen a mostrar
		urlImagenGrande=$(this).data("img");

		//asignamos la imagen por medio de prop
		$("#imagenGrande").prop("src",urlImagenGrande);

	})

});

Utilizando la propiedad prop procedemos a cambiar el atributo src de img al momento que se da clic en la miniatura. De esta manera queda la funcionalidad dinámica gracias al selector de jquery ($(“#thumbs img”)).