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.
- Abre la carpeta de Axel ICO Converter
- Selecciona 1 imagen .jpg, .jpeg .png
- Arrastra la imagen sobre el archovo Axel ICO Converter.bat
- Revisa la carpeta de la imagen que seleccionaste, se creará con el mismo nombre en formato .ICO
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.
@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
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
}