Search code examples
c#.netvb.netpngfreeimage

Transparency in FreeImage goes crazy


In my program I want to load a PNG or ICO file (with transparency) and then save it as a ICO file with transparency.

This is a random png image for testing:

enter image description here

...As you can see it haves transparency.

But when I try to convert it to ICO this is the result:

enter image description here

(Picture taken from Windows explorer)

All the black color is lost.

I've tried to do the same conversion using profesional software as photoshop, or ToyCon and the result ICO file don't have this problem.

This is my code, is the first time I'm using FreeImage and I don't know much about images and alpha-channels or transparency:

Imports FreeImageAPI

'Dim img As FreeImageAPI.FIBITMAP = FreeImage.Load(format, file, FREE_IMAGE_LOAD_FLAGS.ICO_MAKEALPHA)

Public Class Form1

Dim file As String = "C:\Users\Administrador.ELEKTRO-PC\Desktop\auricular 5.png"

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Shown

    Dim format As FreeImageAPI.FREE_IMAGE_FORMAT = FreeImage.GetFileType(file, 32)

    Dim img As FreeImageAPI.FIBITMAP = FreeImage.LoadEx(file)

    Dim Transparency As Byte() = New Byte(0) {}

    FreeImage.SetTransparencyTable(img, Transparency)

    FreeImage.Save(FREE_IMAGE_FORMAT.FIF_ICO, img, "c:\test.ico", FREE_IMAGE_SAVE_FLAGS.DEFAULT)

End Sub

End Class

Solution

  • Done.

    I've deleted the transparency table and seems all is working fine, no need to set the transparency at last, also I did a newbie helper class to manage some basic functions of the library (convert image, rotate, grayscale, resize...) in a easy way:

    #Region " FreeImage Helper "
    
    ' [ FreeImage Helper ]
    '
    ' // By Elektro H@cker
    '
    '
    ' INSTRUCTIONS:
    ' 1. ADD A REFERENCE FOR "FreeImageNET.dll" IN THE PROJECT.
    ' 2. ADD THE "FREEIMAGE.DLL" IN THE PROJECT.
    '
    '
    ' Examples :
    '
    ' MsgBox(FreeImageHelper.Is_Avaliable() ' Result: True
    ' MsgBox(FreeImageHelper.Get_Version()  ' Result: 3.15.1
    ' MsgBox(FreeImageHelper.Get_ImageFormat("C:\Test.png")) ' Result: PNG
    '
    ' FreeImageHelper.Convert("C:\Test.png", "C:\Test.ico", FreeImageAPI.FREE_IMAGE_FORMAT.FIF_ICO)
    ' FreeImageHelper.Convert(New Bitmap("C:\Test.png"), "C:\Test.jpg", FreeImageAPI.FREE_IMAGE_FORMAT.FIF_JPEG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_SUBSAMPLING_444 Or FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYSUPERB)
    '
    ' PictureBox1.BackgroundImage = FreeImageHelper.GrayScale(New Bitmap("C:\Test.bmp"))
    ' PictureBox1.BackgroundImage = FreeImageHelper.GrayScale("C:\Test.bmp")
    '
    ' PictureBox1.BackgroundImage = FreeImageHelper.Resize(New Bitmap("C:\Test.bmp"), 32, 32)
    ' PictureBox1.BackgroundImage = FreeImageHelper.Resize("C:\Test.bmp", 64, 128)
    '
    ' PictureBox1.BackgroundImage = FreeImageHelper.Rotate(New Bitmap("C:\Test.bmp"), 90)
    ' PictureBox1.BackgroundImage = FreeImageHelper.Rotate("C:\Test.bmp", -90)
    '
    ' PictureBox1.BackgroundImage = FreeImageHelper.Thumbnail(New Bitmap("C:\Test.png"), 64, True)
    ' PictureBox1.BackgroundImage = FreeImageHelper.Thumbnail("C:\Test.png", 64, True)
    
    
    
    Imports FreeImageAPI
    
    Public Class FreeImageHelper
    
    ' <summary>
    ' Checks if <i>FreeImage.dll</i> is avaliable on the system.
    ' </summary>
    Public Shared Function Is_Avaliable() As Boolean
        Return FreeImage.IsAvailable
    End Function
    
    ' <summary>
    ' Gets the version of FreeImage.dll.
    ' </summary>
    Shared Function Get_Version() As String
        Return FreeImage.GetVersion
    End Function
    
    ' <summary>
    ' Gets the image format of a image file.
    ' </summary>
    Shared Function Get_ImageFormat(ByVal File As String) As String
        Return FreeImage.GetFileType(File, 0).ToString.Substring(4)
    End Function
    
    ' <summary>
    ' Convert a Bitmap object between image formats and save it to disk.
    ' </summary>
    Shared Sub Convert(ByVal bmp As System.Drawing.Bitmap, _
                       ByVal Output As String, _
                       ByVal NewFormat As FREE_IMAGE_FORMAT, _
                       Optional ByVal SaveFlags As FREE_IMAGE_SAVE_FLAGS = FREE_IMAGE_SAVE_FLAGS.DEFAULT)
    
        Try
            FreeImage.SaveBitmap(bmp, Output, NewFormat, SaveFlags)
        Catch ex As Exception
            ' Throw New Exception(ex.Message)
            MsgBox(ex.Message)
        End Try
    
    End Sub
    
    ' <summary>
    ' Convert a image file between image formats and save it to disk.
    ' </summary>
    Shared Sub Convert(ByVal File As String, _
                       ByVal Output As String, _
                       ByVal NewFormat As FREE_IMAGE_FORMAT, _
                       Optional ByVal SaveFlags As FREE_IMAGE_SAVE_FLAGS = FREE_IMAGE_SAVE_FLAGS.DEFAULT)
    
        Try
            FreeImage.Save(NewFormat, FreeImage.LoadEx(File), Output, SaveFlags)
        Catch ex As Exception
            ' Throw New Exception(ex.Message)
            MsgBox(ex.Message)
        End Try
    
    End Sub
    
    ' <summary>
    ' GrayScales a Bitmap object.
    ' </summary>
    Shared Function GrayScale(ByVal bmp As System.Drawing.Bitmap) As System.Drawing.Bitmap
    
        Try
    
            Dim ImageStream As New System.IO.MemoryStream
            bmp.Save(ImageStream, bmp.RawFormat)
    
            Dim Image As FIBITMAP = FreeImage.LoadFromStream(ImageStream)
            ImageStream.Dispose()
    
            Return FreeImage.GetBitmap(FreeImage.ConvertToGreyscale(Image))
    
        Catch ex As Exception
            ' Throw New Exception(ex.Message)
            MsgBox(ex.Message)
            Return Nothing
        End Try
    
    End Function
    
    ' <summary>
    ' GrayScales a image file.
    ' </summary>
    Shared Function GrayScale(ByVal File As String) As System.Drawing.Bitmap
    
        Try
            Return FreeImage.GetBitmap(FreeImage.ConvertToGreyscale(FreeImage.LoadEx(File)))
        Catch ex As Exception
            ' Throw New Exception(ex.Message)
            MsgBox(ex.Message)
            Return Nothing
        End Try
    
    End Function
    
    ' <summary>
    ' Resizes a Bitmap object.
    ' </summary>
    Shared Function Resize(ByVal bmp As System.Drawing.Bitmap, _
                           ByVal X As Int32, _
                           ByVal Y As Int32, _
                           Optional ByVal Quality As FREE_IMAGE_FILTER = FREE_IMAGE_FILTER.FILTER_BILINEAR) As System.Drawing.Bitmap
    
        Try
    
            Dim ImageStream As New System.IO.MemoryStream
            bmp.Save(ImageStream, bmp.RawFormat)
    
            Dim Image As FIBITMAP = FreeImage.LoadFromStream(ImageStream)
            ImageStream.Dispose()
    
            Return FreeImage.GetBitmap(FreeImage.Rescale(Image, X, Y, Quality))
    
        Catch ex As Exception
            ' Throw New Exception(ex.Message)
            MsgBox(ex.Message)
            Return Nothing
        End Try
    
    End Function
    
    ' <summary>
    ' Resizes a image file.
    ' </summary>
    Shared Function Resize(ByVal File As String, _
                           ByVal X As Int32, _
                           ByVal Y As Int32, _
                           Optional ByVal Quality As FREE_IMAGE_FILTER = FREE_IMAGE_FILTER.FILTER_BILINEAR) As System.Drawing.Bitmap
    
        Try
    
            Return FreeImage.GetBitmap(FreeImage.Rescale(FreeImage.LoadEx(File), X, Y, Quality))
    
        Catch ex As Exception
            ' Throw New Exception(ex.Message)
            MsgBox(ex.Message)
            Return Nothing
        End Try
    
    End Function
    
    ' <summary>
    ' Rotates a Bitmap object.
    ' </summary>
    Shared Function Rotate(ByVal bmp As System.Drawing.Bitmap, _
                           ByVal Angle As Double) As System.Drawing.Bitmap
    
        Try
    
            Dim ImageStream As New System.IO.MemoryStream
            bmp.Save(ImageStream, bmp.RawFormat)
    
            Dim Image As FIBITMAP = FreeImage.LoadFromStream(ImageStream)
            ImageStream.Dispose()
    
            Return FreeImage.GetBitmap(FreeImage.Rotate(Image, Angle))
    
        Catch ex As Exception
            ' Throw New Exception(ex.Message)
            MsgBox(ex.Message)
            Return Nothing
        End Try
    
    End Function
    
    ' <summary>
    ' Rotates a image file.
    ' </summary>
    Shared Function Rotate(ByVal File As String, _
                           ByVal Angle As Double) As System.Drawing.Bitmap
    
        Try
    
            Return FreeImage.GetBitmap(FreeImage.Rotate(FreeImage.LoadEx(File), Angle))
    
        Catch ex As Exception
            ' Throw New Exception(ex.Message)
            MsgBox(ex.Message)
            Return Nothing
        End Try
    
    End Function
    
    ' <summary>
    ' Returns a Thumbnail of a Bitmap object.
    ' </summary>
    Shared Function Thumbnail(ByVal bmp As System.Drawing.Bitmap, _
                                   ByVal size As Int32, _
                                   ByVal convert As Boolean) As System.Drawing.Bitmap
    
        Try
    
            Dim ImageStream As New System.IO.MemoryStream
            bmp.Save(ImageStream, bmp.RawFormat)
    
            Dim Image As FIBITMAP = FreeImage.LoadFromStream(ImageStream)
            ImageStream.Dispose()
    
            Return FreeImage.GetBitmap(FreeImage.MakeThumbnail(Image, size, convert))
    
        Catch ex As Exception
            ' Throw New Exception(ex.Message)
            MsgBox(ex.Message)
            Return Nothing
        End Try
    
    End Function
    
    ' <summary>
    ' Returns a Thumbnail of a image file.
    ' </summary>
    Shared Function Thumbnail(ByVal File As String, _
                                   ByVal size As Int32, _
                                   ByVal convert As Boolean) As System.Drawing.Bitmap
    
        Try
            Return FreeImage.GetBitmap(FreeImage.MakeThumbnail(FreeImage.LoadEx(File), size, convert))
        Catch ex As Exception
            ' Throw New Exception(ex.Message)
            MsgBox(ex.Message)
            Return Nothing
        End Try
    
    End Function
    
    End Class
    
    #End Region