Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Eleкtro en 18 Julio 2013, 06:57 am



Título: [SOLUCIONADO] Problema al convertir Bitmap a Ico
Publicado por: Eleкtro en 18 Julio 2013, 06:57 am
Estoy intentando convertir un Bitmap al tipo de imágen Icono (ICO), para guardar esa imágen al disco en formato ICO, pero el resultado que obtengo es un archivo PNG con la extensión modificada a ICO.

¿Porque la Class ImageFormat me guarda la imagen en formato PNG cuando le estoy indicando que me guarde el archivo en formato ICO?.

No conozco otra manera de de guardar una imágen al disco (sin usar librerías o aplicaciones d terceros), ¿Como resuelvo esto?.

¿Acaso hay algo mal en el code?

Esta es la manera en la que estoy usando mi code:
Código
  1. Save_Icon(Resize_Image(Bitmap.FromFile(PictureBox_Regedit.Tag), "Regedit.ico")

Y esto es el resto del code:
Código
  1. Private Sub Save_Icon(ByVal Source As Bitmap, ByVal Filename As String)
  2.  
  3.    Try
  4.        If Not Directory.Exists(AppDir) Then Directory.CreateDirectory(AppDir)
  5.        If Not Directory.Exists(AppIcons) Then Directory.CreateDirectory(AppIcons)
  6.        Source.MakeTransparent()
  7.        Source.Save(Path.Combine(AppIcons, Filename), ImageFormat.Icon)
  8.    Catch ex As Exception
  9.        Throw New Exception(ex.Message)
  10.    End Try
  11.  
  12. End Sub
  13.  
  14. Private Function Resize_Image(ByVal img As Image, ByVal Width As Int32, ByVal Height As Int32) As Bitmap
  15.    Dim Bitmap_Source As New Bitmap(img)
  16.    Dim Bitmap_Dest As New Bitmap(CInt(24), CInt(24))
  17.    Dim Graphic As Graphics = Graphics.FromImage(Bitmap_Dest)
  18.    Graphic.DrawImage(Bitmap_Source, 0, 0, Bitmap_Dest.Width + 1, Bitmap_Dest.Height + 1)
  19.    Return Bitmap_Dest
  20. End Function

EDITO: El problema sucede tanto usando "maketransparent" como sin usarlo.


Título: Re: Problema al convertir Bitmap a Ico
Publicado por: Eleкtro en 19 Julio 2013, 22:12 pm
Después de hacer un largo research por Google para buscar la mejor manera de este tipo de conversión, me he dado cuenta que el formato ICO en .NET solo son problemas y es casi imposible hablar de ICO + Transparencia en las Classes del framework, y después de pelear mucho con la librería FreeImage, al final he optado por usar un wrapper de esta lib para .NET, y aquí está el code que hice de prueba, funciona:

Código
  1. Imports FreeImageAPI
  2.  
  3. 'Dim img As FreeImageAPI.FIBITMAP = FreeImage.Load(format, file, FREE_IMAGE_LOAD_FLAGS.ICO_MAKEALPHA)
  4.  
  5. Public Class Form1
  6.  
  7. Dim file As String = "C:\Users\Administrador.ELEKTRO-PC\Desktop\auricular 5.png"
  8.  
  9. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Shown
  10.  
  11.    Dim format As FreeImageAPI.FREE_IMAGE_FORMAT = FreeImage.GetFileType(file, 32)
  12.  
  13.    Dim img As FreeImageAPI.FIBITMAP = FreeImage.LoadEx(file)
  14.  
  15.    Dim Transparency As Byte() = New Byte(0) {}
  16.  
  17.    FreeImage.SetTransparencyTable(img, Transparency)
  18.  
  19.    FreeImage.Save(FREE_IMAGE_FORMAT.FIF_ICO, img, "c:\test.ico", FREE_IMAGE_SAVE_FLAGS.DEFAULT)
  20.  
  21. End Sub
  22.  
  23. End Class