سؤال

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
هل كانت مفيدة؟

المحلول

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top