Axel ICO Converter

Viernes 9 de enero, 2026

Enlaces

Descripción

Herramienta para la fácil y rápida conversión de imágenes .JPG .JPEG .PNG al formato .ICO, disponible para Windows 7, 8, 10, 11.

Tutorial

  1. Abre la carpeta de Axel ICO Converter
  2. Selecciona 1 imagen .jpg, .jpeg .png
  3. Arrastra la imagen sobre el archivo Axel ICO Converter.bat
  4. Revisa la carpeta de la imagen que seleccionaste, se creará con el mismo nombre en formato .ICO

Historia

Desde el año 2014 que me llamó la atención la personalización del sistema operativo, por aquél entonces yo tenía instalado Windows 7 Professional en mi netbook del gobierno (Conectar Igualdad), por lo que buscando entre programas de internet encontré uno llamado ToYcon.exe, el cual permitía arrastrar imágenes hasta él y generaba automáticamente una imagen .ico. El problema de este programa lo descubrí muy tarde, alrededor de 2020 cuando lo analicé con VirusTotal y encontré que tenía muchas alertas, además de que era entendible el porqué en los videos de YouTube pedían que se desactive el antivirus para usarlo o que lo excluyan de los análisis de los antivirus.

Por eso, después de esta mala experiencia que tuve al darme cuenta de que un programa que solía usar mucho estaba cargado de virus, es que decidí desinstalarlo, pero hoy, viernes 9 de enero de 2026 en vistas de que ando retomando proyectos viejos para la programación con CMD y PowerShell es que decidí ver si es posible o no convertir imágenes al formato ICO usando solamente herramientas de Windows, y sí lo es. El único inconveniente que encontré es el límite de generación de imágenes, el cual no permite crear varios formatos a la vez como 16x16, 32x32, 48x48, 64x64, 128x128, 256x256, sino que al usar .NET sólo puede crear un único formato, y este programa crea los .ico en 256x256 para conservar la calidad. Además, para hacer la conversión a múltiples formatos se requiere de una librería llamada ImageMagick, la cual no quise instalar porque me gusta que los programas que hago se mantengan funcionales con las herramientas de Windows sin instalar archivos.

Entonces mi experiencia me llevó a dejar de usar herramientas conocidas y a dejar de ver videos de YouTube, pero esto me sirvió para considerar aprender cómo crear las bases para estos programas funcionales que pueden correr únicamente con Windows y sus librerías internas, sin descargar nada más que el .bat y .ps1.

Código del receptor (.bat) y el convertidor (.ps1)

Axel ICO Converter.bat

@echo off
title Axel ICO Converter
color 0f
setlocal
set "IMG=%~1"
if "%IMG%"=="" exit /b
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0jpg2ico.ps1" "%IMG%"
endlocal
</pre>

jpg2ico.ps1

<pre>
param (
    [Parameter(Mandatory=$true)]
    [string]$ImagePath
)
try {
    Add-Type -AssemblyName System.Drawing
    if (-not (Test-Path $ImagePath)) {
        throw "El archivo no existe."
    }
    $Size = 256
    $IcoPath = [System.IO.Path]::ChangeExtension($ImagePath, ".ico")
    $Img = [System.Drawing.Image]::FromFile($ImagePath)
    # FORZAR PixelFormat (evita el error que viste)
    $PixelFormat = [System.Drawing.Imaging.PixelFormat]::Format32bppArgb
    $Bmp = New-Object System.Drawing.Bitmap ($Size), ($Size), ($PixelFormat)
    $Gfx = [System.Drawing.Graphics]::FromImage($Bmp)
    $Gfx.Clear([System.Drawing.Color]::Transparent)
    $Gfx.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
    $Gfx.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::HighQuality
    $Gfx.PixelOffsetMode = [System.Drawing.Drawing2D.PixelOffsetMode]::HighQuality
    # Mantener proporción
    $Ratio = [Math]::Min($Size / $Img.Width, $Size / $Img.Height)
    $NewW = [int]($Img.Width * $Ratio)
    $NewH = [int]($Img.Height * $Ratio)
    $X = ($Size - $NewW) / 2
    $Y = ($Size - $NewH) / 2
    $Gfx.DrawImage($Img, $X, $Y, $NewW, $NewH)
    # PNG en memoria
    $PngStream = New-Object System.IO.MemoryStream
    $Bmp.Save($PngStream, [System.Drawing.Imaging.ImageFormat]::Png)
    $PngBytes = $PngStream.ToArray()
    # Crear ICO válido
    $Fs = [System.IO.File]::Open($IcoPath, [System.IO.FileMode]::Create)
    $Bw = New-Object System.IO.BinaryWriter($Fs)
    # ICONDIR
    $Bw.Write([UInt16]0)
    $Bw.Write([UInt16]1)
    $Bw.Write([UInt16]1)
    # ICONDIRENTRY (0 = 256 px)
    $Bw.Write([Byte]0)
    $Bw.Write([Byte]0)
    $Bw.Write([Byte]0)
    $Bw.Write([Byte]0)
    $Bw.Write([UInt16]1)
    $Bw.Write([UInt16]32)
    $Bw.Write([UInt32]$PngBytes.Length)
    $Bw.Write([UInt32]22)
    $Bw.Write($PngBytes)
    # Limpieza
    $Bw.Close()
    $Fs.Close()
    $PngStream.Dispose()
    $Gfx.Dispose()
    $Bmp.Dispose()
    $Img.Dispose()
}
catch {
    Write-Host ""
    Write-Host "ERROR DETECTADO:" -ForegroundColor Red
    Write-Host $_.Exception.Message -ForegroundColor Red
    Write-Host ""
    Write-Host "DETALLE COMPLETO:" -ForegroundColor Yellow
    $_ | Format-List * | Out-String | Write-Host
}
</pre>

Comentarios

Entradas populares de este blog

Axel AES Encrypt Text (Cifrador de textos de Axel N. Inca)