Converting a .png to a .ico file

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
EntropicBlackhole
Posts: 40
Joined: 12 Jun 2021, 15:28

Converting a .png to a .ico file

14 Aug 2021, 18:31

Alright so, I know a way to download images off the internet, only one thing, I need to find out how to convert it to an ico file, I found a post (https://autohotkey.com/board/topic/82416-ico-createrconverter-png-to-ico/) but it was originally uploaded to ahknet, which yeah, and I can't find someone who backup'd this script beforehand, the creator was last online 5 years ago, so yeah, uh, I need it because after downloading the image from imgur i need a way to convert it to a .ico file, I've searched in AHKStudio's code and I can't find how it's done, but if you delete the icon it will redownload it, so does anyone have a backup of Rseding91's script, or perhaps knows another way of performing this?, thanks

Also for how to download an image from the internet, just right click any image, and press o, now just put this: (that image is the icon I want to make, just replace it with whatever will be on your clipboard after right clicking an image and pressing "o")

Code: Select all

UrlDownloadToFile, https://i.imgur.com/Q8A89b1.png, C:\Users\%A_UserName%\Downloads\test.png
yes its that easy
teadrinker
Posts: 4412
Joined: 29 Mar 2015, 09:41
Contact:

Re: Converting a .png to a .ico file

14 Aug 2021, 19:57

Try this:

Code: Select all

Png2Icon("D:\Downloads\image.png", A_Desktop . "\test.ico")

Png2Icon(sourcePng, destIco) {
   hBitmap := LoadPicture(sourcePng, "GDI+")
   hIcon := HIconFromHBitmap(hBitmap)
   HiconToFile(hIcon, destIco)
   DllCall("DestroyIcon", "Ptr", hIcon), DllCall("DeleteObject", hBitmap)
}

HIconFromHBitmap(hBitmap) {
   VarSetCapacity(BITMAP, size := 4*4 + A_PtrSize*2, 0)
   DllCall("GetObject", "Ptr", hBitmap, "Int", size, "Ptr", &BITMAP)
   width := NumGet(BITMAP, 4, "UInt"), height := NumGet(BITMAP, 8, "UInt")
   hDC := DllCall("GetDC", "Ptr", 0, "Ptr")
   hCBM := DllCall("CreateCompatibleBitmap", "Ptr", hDC, "Int", width, "Int", height, "Ptr")
   VarSetCapacity(ICONINFO, 4*2 + A_PtrSize*3, 0)
   NumPut(1, ICONINFO)
   NumPut(hCBM, ICONINFO, 4*2 + A_PtrSize)
   NumPut(hBitmap, ICONINFO, 4*2 + A_PtrSize*2)
   hIcon := DllCall("CreateIconIndirect", "Ptr", &ICONINFO, "Ptr")
   DllCall("DeleteObject", "Ptr", hCBM), DllCall("ReleaseDC", "Ptr", 0, "Ptr", hDC)
   Return hIcon
}

HiconToFile(hIcon, destFile) {
   static szICONHEADER := 6, szICONDIRENTRY := 16, szBITMAP := 16 + A_PtrSize*2, szBITMAPINFOHEADER := 40
        , IMAGE_BITMAP := 0, flags := (LR_COPYDELETEORG := 0x8) | (LR_CREATEDIBSECTION := 0x2000)
        , szDIBSECTION := szBITMAP + szBITMAPINFOHEADER + 8 + A_PtrSize*3
        , copyImageParams := ["UInt", IMAGE_BITMAP, "Int", 0, "Int", 0, "UInt", flags, "Ptr"]

   VarSetCapacity(ICONINFO, 8 + A_PtrSize*3, 0)
   DllCall("GetIconInfo", "Ptr", hIcon, "Ptr", &ICONINFO)
   if !hbmMask  := DllCall("CopyImage", "Ptr", NumGet(ICONINFO, 8 + A_PtrSize), copyImageParams*) {
      MsgBox, % "CopyImage failed. LastError: " . A_LastError
      Return
   }
   hbmColor := DllCall("CopyImage", "Ptr", NumGet(ICONINFO, 8 + A_PtrSize*2), copyImageParams*)
   VarSetCapacity(mskDIBSECTION, szDIBSECTION, 0)
   VarSetCapacity(clrDIBSECTION, szDIBSECTION, 0)
   DllCall("GetObject", "Ptr", hbmMask , "Int", szDIBSECTION, "Ptr", &mskDIBSECTION)
   DllCall("GetObject", "Ptr", hbmColor, "Int", szDIBSECTION, "Ptr", &clrDIBSECTION)

   clrWidth        := NumGet(clrDIBSECTION,  4, "UInt")
   clrHeight       := NumGet(clrDIBSECTION,  8, "UInt")
   clrBmWidthBytes := NumGet(clrDIBSECTION, 12, "UInt")
   clrBmPlanes     := NumGet(clrDIBSECTION, 16, "UShort")
   clrBmBitsPixel  := NumGet(clrDIBSECTION, 18, "UShort")
   clrBits         := NumGet(clrDIBSECTION, 16 + A_PtrSize)
   colorCount := clrBmBitsPixel >= 8 ? 0 : 1 << (clrBmBitsPixel * clrBmPlanes)
   clrDataSize := clrBmWidthBytes * clrHeight

   mskHeight       := NumGet(mskDIBSECTION,  8, "UInt")
   mskBmWidthBytes := NumGet(mskDIBSECTION, 12, "UInt")
   mskBits         := NumGet(mskDIBSECTION, 16 + A_PtrSize)
   mskDataSize := mskBmWidthBytes * mskHeight

   iconDataSize := clrDataSize + mskDataSize
   dwBytesInRes := szBITMAPINFOHEADER + iconDataSize
   dwImageOffset := szICONHEADER + szICONDIRENTRY

   VarSetCapacity(ICONHEADER, szICONHEADER, 0)
   NumPut(1, ICONHEADER, 2, "UShort")
   NumPut(1, ICONHEADER, 4, "UShort")

   VarSetCapacity(ICONDIRENTRY, szICONDIRENTRY, 0)
   NumPut(clrWidth      , ICONDIRENTRY,  0, "UChar")
   NumPut(clrHeight     , ICONDIRENTRY,  1, "UChar")
   NumPut(colorCount    , ICONDIRENTRY,  2, "UChar")
   NumPut(clrBmPlanes   , ICONDIRENTRY,  4, "UShort")
   NumPut(clrBmBitsPixel, ICONDIRENTRY,  6, "UShort")
   NumPut(dwBytesInRes  , ICONDIRENTRY,  8, "UInt")
   NumPut(dwImageOffset , ICONDIRENTRY, 12, "UInt")

   NumPut(clrHeight*2 , clrDIBSECTION, szBITMAP +  8, "UInt")
   NumPut(iconDataSize, clrDIBSECTION, szBITMAP + 20, "UInt")
   
   File := FileOpen(destFile, "w", "cp0")
   File.RawWrite(ICONHEADER, szICONHEADER)
   File.RawWrite(ICONDIRENTRY, szICONDIRENTRY)
   File.RawWrite(&clrDIBSECTION + szBITMAP, szBITMAPINFOHEADER)
   File.RawWrite(clrBits + 0, clrDataSize)
   File.RawWrite(mskBits + 0, mskDataSize)
   File.Close()

   DllCall("DeleteObject", "Ptr", hbmColor)
   DllCall("DeleteObject", "Ptr", hbmMask)
}
Last edited by teadrinker on 14 Aug 2021, 20:48, edited 1 time in total.
User avatar
JoeWinograd
Posts: 2214
Joined: 10 Feb 2014, 20:00
Location: U.S. Central Time Zone

Re: Converting a .png to a .ico file

14 Aug 2021, 20:12

Hi teadrinker,
What is SysError()? Is it OK to use A_LastError there instead? Thanks, Joe
teadrinker
Posts: 4412
Joined: 29 Mar 2015, 09:41
Contact:

Re: Converting a .png to a .ico file

14 Aug 2021, 20:47

Ah, sorry, it's in my user library. I'll change to the A_LastError. However:

Code: Select all

MsgBox, 16, Error: 0x80004008, % SysError(0x80004008)

SysError(ErrorNum := "")
{ 
   static flags := (FORMAT_MESSAGE_ALLOCATE_BUFFER := 0x100) | (FORMAT_MESSAGE_FROM_SYSTEM := 0x1000)
   (ErrorNum = "" && ErrorNum := A_LastError)
   DllCall("FormatMessage", "UInt", flags, "UInt", 0, "UInt", ErrorNum, "UInt", 0, "PtrP", pBuff, "UInt", 512, "Str", "")
   str := StrGet(pBuff), DllCall("LocalFree", "Ptr", pBuff)
   Return str ? str : ErrorNum
}
User avatar
JoeWinograd
Posts: 2214
Joined: 10 Feb 2014, 20:00
Location: U.S. Central Time Zone

Re: Converting a .png to a .ico file

14 Aug 2021, 21:38

teadrinker wrote:it's in my user library
Ah, very nice function! Will put in my lib.

Now, back to the conversion. It makes an ICO with the same resolution as the input PNG. Is it possible to create a multi-image .ICO file that has these size icons in it when the input is a 256x256 PNG:

16x16
24x24
32x32
48x48
256x256

I've been using this site to convert 256x256 PNGs to ICOs:
https://icoconvert.com/

It creates a .ICO file with the five sizes of icons shown above. I'd rather use your code to do it, but I need those five sizes in the .ICO file. Thanks, Joe
teadrinker
Posts: 4412
Joined: 29 Mar 2015, 09:41
Contact:

Re: Converting a .png to a .ico file

15 Aug 2021, 03:15

Knowing the structure of the ico file, it is easy to change the Png2Icon() function to create an icon with multiple images.

Code: Select all

SetBatchLines, -1

pngImagePath := "D:\Downloads\image.png"
destIcoPath := A_Desktop . "\test.ico"

HIcons := []
for k, v in [256, 48, 32, 24, 16] {
   hBitmap := ScaleImage(pngImagePath, v)
   HIcons.Push( HIconFromHBitmap(hBitmap) )
   DllCall("DeleteObject", "Ptr", hBitmap)
}
CollectIcon(destIcoPath, HIcons)
for k, v in HIcons
   DllCall("DestroyIcon", "Ptr", v)

ScaleImage(sourceImgFile, maxSize := 256) {
   static CLSID_WICImagingFactory       := "{CACAF262-9370-4615-A13B-9F5539DA4C0A}"
         , IID_IWICImagingFactory       := "{EC5EC8A9-C395-4314-9C77-54D7A935FF70}"
         , GUID_WICPixelFormat32bppBGRA := "{6FDDC324-4E03-4BFE-B185-3D77768DC90F}"
         , GENERIC_READ := 0x80000000, WICDecodeMetadataCacheOnDemand := 0
         , WICBitmapUseAlpha := 0, WICBitmapInterpolationModeFant := 0x3, WICBitmapInterpolationModeHighQualityCubic := 0x4
         , InterpolationMode := A_OSVersion ~= "^\d" ? WICBitmapInterpolationModeHighQualityCubic : WICBitmapInterpolationModeFant
         
   IWICImagingFactory := ComObjCreate(CLSID_WICImagingFactory, IID_IWICImagingFactory)
   Vtable( IWICImagingFactory, CreateDecoderFromFilename :=  3 ).Call( "WStr", sourceImgFile, "Ptr", 0, "UInt", GENERIC_READ
                                                                     , "UInt", WICDecodeMetadataCacheOnDemand, "PtrP", IWICBitmapDecoder, "UInt" )
   Vtable( IWICBitmapDecoder , GetFrame                  := 13 ).Call( "UInt", 0, "PtrP", IWICBitmapSource )
   VarSetCapacity(GUID, 16, 0)
   DllCall("ole32\CLSIDFromString", "WStr", GUID_WICPixelFormat32bppBGRA, "Ptr", &GUID)
   hr := DllCall("Windowscodecs\WICConvertBitmapSource", "Ptr", &GUID, "Ptr", IWICBitmapSource, "PtrP", DestIWICBitmapSource)
   if (hr = 0)
      ObjRelease(IWICBitmapSource), IWICBitmapSource := DestIWICBitmapSource
   
   Vtable( IWICBitmapSource, GetSize := 3 ).Call("UIntP", width, "UIntP", height)
   if (width > height)
      height *= maxSize/width, width := maxSize
   else
      width *= maxSize/height, height := maxSize
   width := Round(width), height := Round(height)
   stride := width*4, size := stride*height
   
   hBitmap := CreateDIBSection(width, -height, pBits)
   Vtable( IWICImagingFactory, CreateBitmapScaler := 11 ).Call("PtrP", IWICBitmapScaler)
   Vtable( IWICBitmapScaler  , Initialize         :=  8 ).Call("Ptr", IWICBitmapSource, "UInt", width, "UInt", height, "UInt", InterpolationMode)
   Vtable( IWICBitmapScaler  , CopyPixels         :=  7 ).Call("Ptr", 0, "UInt", stride, "UInt", size, "Ptr", pBits)
   for k, v in [IWICBitmapScaler, IWICBitmapSource, IWICBitmapDecoder, IWICImagingFactory]
      ObjRelease(v)
   Return hBitmap
}

Vtable(ptr, n) {
   Return Func("DllCall").Bind(NumGet(NumGet(ptr+0), A_PtrSize*n), "Ptr", ptr)
}

CreateDIBSection(w, h, ByRef ppvBits := 0, bpp := 32) {
   hDC := DllCall("GetDC", "Ptr", 0, "Ptr")
   VarSetCapacity(BITMAPINFO, 40, 0)
   NumPut(40 , BITMAPINFO,  0)
   NumPut( w , BITMAPINFO,  4)
   NumPut( h , BITMAPINFO,  8)
   NumPut( 1 , BITMAPINFO, 12)
   NumPut(bpp, BITMAPINFO, 14)
   hBM := DllCall("CreateDIBSection", "Ptr", hDC, "Ptr", &BITMAPINFO, "UInt", 0, "PtrP", ppvBits, "Ptr", 0, "UInt", 0, "Ptr")
   DllCall("ReleaseDC", "Ptr", 0, "Ptr", hDC)
   return hBM
}

HIconFromHBitmap(hBitmap) {
   VarSetCapacity(BITMAP, size := 4*4 + A_PtrSize*2, 0)
   DllCall("GetObject", "Ptr", hBitmap, "Int", size, "Ptr", &BITMAP)
   width := NumGet(BITMAP, 4, "UInt"), height := NumGet(BITMAP, 8, "UInt")
   hDC := DllCall("GetDC", "Ptr", 0, "Ptr")
   hCBM := DllCall("CreateCompatibleBitmap", "Ptr", hDC, "Int", width, "Int", height, "Ptr")
   VarSetCapacity(ICONINFO, 4*2 + A_PtrSize*3, 0)
   NumPut(1, ICONINFO)
   NumPut(hCBM, ICONINFO, 4*2 + A_PtrSize)
   NumPut(hBitmap, ICONINFO, 4*2 + A_PtrSize*2)
   hIcon := DllCall("CreateIconIndirect", "Ptr", &ICONINFO, "Ptr")
   DllCall("DeleteObject", "Ptr", hCBM), DllCall("ReleaseDC", "Ptr", 0, "Ptr", hDC)
   Return hIcon
}

CollectIcon(destFile, HIcons) {
   static szICONHEADER := 6, szICONDIRENTRY := 16, szBITMAP := 16 + A_PtrSize*2, szBITMAPINFOHEADER := 40
        , IMAGE_BITMAP := 0, flags := (LR_COPYDELETEORG := 0x8) | (LR_CREATEDIBSECTION := 0x2000)
        , szDIBSECTION := szBITMAP + szBITMAPINFOHEADER + 8 + A_PtrSize*3
        , copyImageParams := ["UInt", IMAGE_BITMAP, "Int", 0, "Int", 0, "UInt", flags, "Ptr"]
        
   VarSetCapacity(ICONINFO, 8 + A_PtrSize*3, 0)
   VarSetCapacity(mskDIBSECTION, szDIBSECTION, 0)
   VarSetCapacity(clrDIBSECTION, szDIBSECTION, 0)
   VarSetCapacity(ICONHEADER, szICONHEADER, 0)
   VarSetCapacity(ICONDIRENTRY, szICONDIRENTRY, 0)
   
   NumPut(1, ICONHEADER, 2, "UShort")
   NumPut(HIcons.Count(), ICONHEADER, 4, "UShort")
   File := FileOpen(destFile, "w", "cp0")
   File.RawWrite(ICONHEADER, szICONHEADER)
   allDataSize := 0
   for k, hIcon in HIcons {
      DllCall("GetIconInfo", "Ptr", hIcon, "Ptr", &ICONINFO)
      if !hbmMask  := DllCall("CopyImage", "Ptr", NumGet(ICONINFO, 8 + A_PtrSize), copyImageParams*) {
         MsgBox, % "CopyImage failed. LastError: " . SysError()
         Return
      }
      hbmColor := DllCall("CopyImage", "Ptr", NumGet(ICONINFO, 8 + A_PtrSize*2), copyImageParams*)
      DllCall("GetObject", "Ptr", hbmMask , "Int", szDIBSECTION, "Ptr", &mskDIBSECTION)
      DllCall("GetObject", "Ptr", hbmColor, "Int", szDIBSECTION, "Ptr", &clrDIBSECTION)

      clrWidth        := NumGet(clrDIBSECTION,  4, "UInt")
      clrHeight       := NumGet(clrDIBSECTION,  8, "UInt")
      clrBmWidthBytes := NumGet(clrDIBSECTION, 12, "UInt")
      clrBmPlanes     := NumGet(clrDIBSECTION, 16, "UShort")
      clrBmBitsPixel  := NumGet(clrDIBSECTION, 18, "UShort")
      clrBits         := NumGet(clrDIBSECTION, 16 + A_PtrSize)
      colorCount := clrBmBitsPixel >= 8 ? 0 : 1 << (clrBmBitsPixel * clrBmPlanes)
      clrDataSize := clrBmWidthBytes * clrHeight

      mskHeight       := NumGet(mskDIBSECTION,  8, "UInt")
      mskBmWidthBytes := NumGet(mskDIBSECTION, 12, "UInt")
      mskBits         := NumGet(mskDIBSECTION, 16 + A_PtrSize)
      mskDataSize := mskBmWidthBytes * mskHeight

      iconDataSize := clrDataSize + mskDataSize
      dwBytesInRes := szBITMAPINFOHEADER + iconDataSize
      dwImageOffset := szICONHEADER + szICONDIRENTRY*HIcons.Count() + allDataSize
      allDataSize += dwBytesInRes
      
      NumPut(clrWidth      , ICONDIRENTRY,  0, "UChar")
      NumPut(clrHeight     , ICONDIRENTRY,  1, "UChar")
      NumPut(colorCount    , ICONDIRENTRY,  2, "UChar")
      NumPut(clrBmPlanes   , ICONDIRENTRY,  4, "UShort")
      NumPut(clrBmBitsPixel, ICONDIRENTRY,  6, "UShort")
      NumPut(dwBytesInRes  , ICONDIRENTRY,  8, "UInt")
      NumPut(dwImageOffset , ICONDIRENTRY, 12, "UInt")

      NumPut(clrHeight*2 , clrDIBSECTION, szBITMAP +  8, "UInt")
      NumPut(iconDataSize, clrDIBSECTION, szBITMAP + 20, "UInt")

      File.Pos := szICONHEADER + szICONDIRENTRY*(k - 1)
      File.RawWrite(ICONDIRENTRY, szICONDIRENTRY)
      File.Pos := dwImageOffset
      File.RawWrite(&clrDIBSECTION + szBITMAP, szBITMAPINFOHEADER)
      File.RawWrite(clrBits + 0, clrDataSize)
      File.RawWrite(mskBits + 0, mskDataSize)

      DllCall("DeleteObject", "Ptr", hbmColor)
      DllCall("DeleteObject", "Ptr", hbmMask)
   }
   File.Close()
}
Note! In the ScaleImage() function I used this form

Code: Select all

Vtable( IWICBitmapSource, GetSize := 3 ).Call("UIntP", width, "UIntP", height)

Vtable(ptr, n) {
   Return Func("DllCall").Bind(NumGet(NumGet(ptr+0), A_PtrSize*n), "Ptr", ptr)
}
just for clarity, this greatly reduces performance. In the real code I'd use

Code: Select all

DllCall(NumGet(NumGet(IWICBitmapSource + 0) + A_PtrSize*3), "Ptr", IWICBitmapSource, "UIntP", width, "UIntP", height)
User avatar
JoeWinograd
Posts: 2214
Joined: 10 Feb 2014, 20:00
Location: U.S. Central Time Zone

Re: Converting a .png to a .ico file

15 Aug 2021, 14:38

teadrinker wrote:change the Png2Icon() function to create an icon with multiple images
Hi teadrinker,
The conversion to a .ICO file with the five images works, but the colors are off. Attached is a sample 256x256 PNG from the IconArchive site. Also attached are the conversions to a .ICO file from your code and from the ICOConvert site. In addition to the color differences, there's also a significant file size difference. What are your thoughts on this? Regards, Joe
Attachments
png-to-icon-testing.zip
(88.26 KiB) Downloaded 65 times
teadrinker
Posts: 4412
Joined: 29 Mar 2015, 09:41
Contact:

Re: Converting a .png to a .ico file

15 Aug 2021, 15:15

JoeWinograd wrote: there's also a significant file size difference
They put the 256x256 image into the file in the png format, not icon, hence the difference.
JoeWinograd wrote: but the colors are off
I'll try to see.
User avatar
JoeWinograd
Posts: 2214
Joined: 10 Feb 2014, 20:00
Location: U.S. Central Time Zone

Re: Converting a .png to a .ico file

15 Aug 2021, 15:33

teadrinker wrote:put the 256x256 image into the file in the png format, not icon
Didn't realize that...would have expected all the different size images to be in icon format. My initial thought was a difference in color depth, not format.
teadrinker wrote:I'll try to see.
Thanks!
teadrinker
Posts: 4412
Joined: 29 Mar 2015, 09:41
Contact:

Re: Converting a .png to a .ico file

15 Aug 2021, 15:46

I'll try to reproduce putting in the png format tomorrow. Just now you can comment these lines:

Code: Select all

   VarSetCapacity(GUID, 16, 0)
   DllCall("ole32\CLSIDFromString", "WStr", GUID_WICPixelFormat32bppBGRA, "Ptr", &GUID)
   hr := DllCall("Windowscodecs\WICConvertBitmapSource", "Ptr", &GUID, "Ptr", IWICBitmapSource, "PtrP", DestIWICBitmapSource)
   if (hr = 0)
      ObjRelease(IWICBitmapSource), IWICBitmapSource := DestIWICBitmapSource
If 32 bpp file is used, this is unnecessary conversion, and colors will stay the same.
User avatar
JoeWinograd
Posts: 2214
Joined: 10 Feb 2014, 20:00
Location: U.S. Central Time Zone

Re: Converting a .png to a .ico file

15 Aug 2021, 16:03

teadrinker wrote:Just now you can comment these lines
Done!
teadrinker wrote:If 32 bpp file is used, this is unnecessary conversion, and colors will stay the same.
Yes, colors and size both stayed the same with those lines commented out.
teadrinker
Posts: 4412
Joined: 29 Mar 2015, 09:41
Contact:

Re: Converting a .png to a .ico file

15 Aug 2021, 16:15

In reality, the code must recognize the bit depth of the source file and save this depth. I'll implement this later.
User avatar
JoeWinograd
Posts: 2214
Joined: 10 Feb 2014, 20:00
Location: U.S. Central Time Zone

Re: Converting a .png to a .ico file

15 Aug 2021, 17:08

Sounds good!
EntropicBlackhole
Posts: 40
Joined: 12 Jun 2021, 15:28

Re: Converting a .png to a .ico file

15 Aug 2021, 22:42

Thank you a lot teadrinker! really appreciate it, I'll credit you in my code because its for something special that I havent seen anyone else do with ahk before and I'll post it online, so yeah, thanks!
User avatar
SKAN
Posts: 1551
Joined: 29 Sep 2013, 16:58

Re: Converting a .png to a .ico file

16 Aug 2021, 12:25

EntropicBlackhole wrote:
15 Aug 2021, 22:42
I havent seen anyone else do with ahk
You haven't seen doesn't necessarily mean it hasn't been done before.!
teadrinker
Posts: 4412
Joined: 29 Mar 2015, 09:41
Contact:

Re: Converting a .png to a .ico file

16 Aug 2021, 12:35

There is nothing new under the sun! :)
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: Converting a .png to a .ico file

16 Aug 2021, 17:46

I am not agree with You.
There a lot of different not documented api, only need knowledge to hack it.
teadrinker
Posts: 4412
Joined: 29 Mar 2015, 09:41
Contact:

Re: Converting a .png to a .ico file

16 Aug 2021, 18:14

malcev wrote: I am not agree with You.
With me? Why?
malcev
Posts: 1769
Joined: 12 Aug 2014, 12:37

Re: Converting a .png to a .ico file

16 Aug 2021, 18:26

You tell that there is nothing new under the sun!
As I understand You mean that all already was done before.
But I think that there are some things that can be done but are not done yet on any program language, because their api is not documented.

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: macromint, peter_ahk, Spawnova and 339 guests