December 03, 2020, 08:13:18 PM

Author Topic: [bb] .ico file loader by Snarkbait [ 1+ years ago ]  (Read 599 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] .ico file loader by Snarkbait [ 1+ years ago ]
« on: June 29, 2017, 12:28:39 AM »
Title : .ico file loader
Author : Snarkbait
Posted : 1+ years ago

Description : Loads .ico files (4-bit,16-bit and 24-bit) into blitz without the use of external DLL. Can also load the mask (or AND image) of the icon as an image.

Blitz Plus example:
Code: [Select]
Include "loadicofile.bb"

Global main = CreateWindow("ICO Loader",0,0,800,600,0,9)

this$ = RequestFile$("Open ICO Image","ico")

SetStatusText main,getICOinfo$(this$)

starttime# = MilliSecs()
convertedimage = loadicoimage(this$,1,False)
MidHandle convertedimage

;ScaleImage convertedimage,5,5
endtime# = MilliSecs() - starttime

canvas = CreateCanvas(100,100,200,200,main)
canvas2 = CreateCanvas(400,100,200,200,main)



SetBuffer CanvasBuffer(canvas)
ClsColor 128,128,128
Cls

DrawBlock convertedimage,100,100
Text 0,0,"Time to load:" + endtime + " msecs"
FlipCanvas canvas

imagemask = loadicoimage(this$,1,True)
MidHandle imagemask
;ScaleImage imagemask,5,5
SetBuffer CanvasBuffer(canvas2)
ClsColor 128,128,128
Cls

DrawBlock imagemask,100,100
Text 0,0,"Time to load:" + endtime + " msecs"
FlipCanvas canvas2

WaitKey()
End



Code :
Code: BlitzBasic
  1. ;loadICOfile.bb include
  2. ;
  3. ; for 4-bit,8-bit and 24-bit .ico files
  4. ; will load 16x16, 32x32 and 48x48 icon files
  5. ;
  6. ;
  7. ; by snarkbait snarkbait66@gmail.com
  8. ;
  9. ; usage:
  10. ; icon = loadICOimage(iconfile$, indexnumber%, returnMask_boolean)
  11.  
  12.  
  13. Dim pallette256(255,2) ; make array for 16 and 256-color icons
  14.  
  15. Type icoinfo
  16. Field bCount,bWidth,bHeight,bColorCount,bReserved,wPlanes,wBitCount,dwBytesInRes,dwImageOffset
  17. End Type
  18.  
  19. Global black = argb(0,0,0)
  20. Global white = argb(255,255,255)
  21.  
  22. Function getICOinfo$(icon$)
  23.         icofile = ReadFile(icon$)
  24.         If Not icofile RuntimeError "file not found"
  25.         ; icon header
  26.         idReserved = ReadShort(icofile) ;should be 0
  27.         idType = ReadShort(icofile);should be 1
  28.         If idType <> 1 RuntimeError "Not a valid .ico file"
  29.         idCount = ReadShort(icofile) ; number of icons in file
  30.         info$ = "Icon file has " + idCount + " icons."
  31.         For iconcount = 1 To idCount
  32.                 bWidth = ReadByte(icofile)
  33.                 bHeight = ReadByte(icofile) ; sometimes double the width, still use width
  34.                 bColorCount = ReadByte(icofile) ;# entries in pallette table
  35.                 bReserved = ReadByte(icofile) ; should be 0
  36.                 wPlanes = ReadShort(icofile) ;?
  37.                 wBitCount = ReadShort(icofile) ;bpp - if 0 use bpp info from bitmap header
  38.                 dwBytesInRes = ReadInt(icofile) ;total bytes of image including AND & XOR info
  39.                 dwImageOffset = ReadInt(icofile) ; offset to beginning of img data
  40.                 index$ = index$ + " Icon#" + iconcount + ":" + bWidth + "x" + bWidth + " - " + wBitCount + " bits per pixel   :"
  41.         Next
  42.         CloseFile icofile
  43.         info$ = info$ + index$
  44.         Return info$
  45. End Function
  46.  
  47.  
  48.  
  49.  
  50. Function loadICOimage(icon$,icoImageNumber = 1,returnMask = False) ; if returnMask = true, image returned will be black-and-white mask
  51.         icofile = ReadFile(icon$)
  52.         If Not icofile RuntimeError "file not found"
  53.         ; icon header
  54.         idReserved = ReadShort(icofile) ;should be 0
  55.         idType = ReadShort(icofile);should be 1
  56.         If idType <> 1 RuntimeError "Not a valid .ico file"
  57.         idCount = ReadShort(icofile) ; number of icons in file
  58.         For iconcount = 1 To idCount
  59.                 ;Icon Dir Entry
  60.                 ico.icoinfo = New icoinfo
  61.                 icoCount = iconcount
  62.                 icoWidth = ReadByte(icofile)
  63.                 icoHeight = ReadByte(icofile)
  64.                 icoColorCount = ReadByte(icofile) ;# entries in pallette table
  65.                 icoReserved = ReadByte(icofile) ; should be 0
  66.                 icowPlanes = ReadShort(icofile) ;?
  67.                 icowBitCount = ReadShort(icofile) ;bpp - if 0 use bpp info from bitmap header
  68.                 icodwBytesInRes = ReadInt(icofile) ;total bytes of image including AND & XOR info
  69.                 icodwImageOffset = ReadInt(icofile) ; offset to beginning of img data
  70.         Next
  71.        
  72.         ; read image entries
  73.         For ico.icoinfo = Each icoinfo
  74.                 If icoCount = icoImageNumber  
  75.                         SeekFile(icofile,icodwImageOffset)
  76.                         biSize = ReadInt(icofile)
  77.                         biWidth = ReadInt(icofile)
  78.                         biHeight = ReadInt(icofile) ; x 2
  79.                         biPlanes = ReadShort(icofile)
  80.                         biBitCount = ReadShort(icofile)
  81.                         biCompression = ReadInt(icofile)
  82.                         biSizeimage = ReadInt(icofile)
  83.                         ; go to bitmap info
  84.                         SeekFile(icofile,icodwImageOffset + biSize)
  85.                        
  86.                         Select biBitCount
  87.                        
  88.                         Case 4 ; 16-colour pallette
  89.                                 ; read pallette
  90.                                 For color_value = 0 To 15
  91.                                         For RGB = 0 To 2
  92.                                                 readval = ReadByte(icofile)
  93.                                                 pallette256(color_value,RGB) = readval ;use the same array for 16-color pallette
  94.                                         Next
  95.                                         useless = ReadByte(icofile) ;reserved byte - not used
  96.                                 Next
  97.                                 If Not returnMask ; return actual icon image
  98.                                         newimage = CreateImage(biWidth,biHeight/2)
  99.                                         SetBuffer ImageBuffer(newimage)
  100.                                         LockBuffer
  101.                                         For ycount = biHeight/2 To 1 Step -1 ;icons are stored bottom row-up, right-to-left
  102.                                                 For xcount = 1 To biWidth Step 2
  103.                                                         readval = ReadByte(icofile)
  104.                                                         leftbits = readval Shr 4 ;16-color pixels are stored 2 pixels per byte, high-order 4-bits first
  105.                                                         rtbits = readval And $f ; get low order 4-bits for next pixel
  106.                                                         WritePixelFast xcount - 1,ycount - 1,argb(pallette256(leftbits,2),pallette256(leftbits,1),pallette256(leftbits,0))
  107.                                                         WritePixelFast xcount,ycount - 1,argb(pallette256(rtbits,2),pallette256(rtbits,1),pallette256(rtbits,0))
  108.                                                 Next
  109.                                         Next                           
  110.                                         UnlockBuffer
  111.                                 Else ; return mask image
  112.                                         SeekFile(icofile,icodwImageOffset + biSize + (2^biBitCount * 4) + (biWidth ^ 2/2)) ; go to start of mask info
  113.                                         newimage = CreateImage(biWidth,biHeight/2)
  114.                                         SetBuffer ImageBuffer(newimage)
  115.                                         LockBuffer
  116.                                         If biWidth = 32 ;32x32 icon
  117.                                                 For ycount = biHeight/2 To 1 Step -1
  118.                                                         For xcount = 0 To 3
  119.                                                                 readval = ReadByte(icofile)
  120.                                                                 xpos = 0
  121.                                                                 For bits = 8 To 1 Step -1
  122.                                                                         readbit = (readval And (2^bits - 1)) Shr (bits - 1) ; get individual bits from byte
  123.                                                                         If readbit
  124.                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,white ; if bit = 1, paint pixel white
  125.                                                                         Else
  126.                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,black ; if bit = 0, paint pixel black
  127.                                                                         EndIf
  128.                                                                         xpos = xpos + 1
  129.                                                                 Next
  130.                                                         Next
  131.                                                 Next
  132.                                         Else
  133.                                                 If biWidth = 16 ; 16x16 icon
  134.                                                         For ycount = biHeight/2 To 1 Step -1
  135.                                                                 For xcount = 0 To 1
  136.                                                                         readval = ReadByte(icofile)
  137.                                                                         xpos = 0
  138.                                                                         For bits = 8 To 1 Step -1
  139.                                                                                 readbit = (readval And (2^bits - 1)) Shr (bits - 1)
  140.                                                                                 If readbit
  141.                                                                                         WritePixelFast (xcount * 8) + xpos,ycount - 1,white
  142.                                                                                 Else
  143.                                                                                         WritePixelFast (xcount * 8) + xpos,ycount - 1,black
  144.                                                                                 EndIf
  145.                                                                                 xpos = xpos + 1
  146.                                                                         Next
  147.                                                                 Next
  148.                                                                 skip = ReadShort(icofile) ; skip past pad bytes
  149.                                                         Next
  150.                                                 Else
  151.                                                         If biWidth = 48 ; 48x48 icon
  152.                                                                 For ycount = biHeight/2 To 1 Step -1
  153.                                                                         For xcount = 0 To 5
  154.                                                                                 readval = ReadByte(icofile)
  155.                                                                                 xpos = 0
  156.                                                                                 For bits = 8 To 1 Step -1
  157.                                                                                         readbit = (readval And (2^bits - 1)) Shr (bits - 1)
  158.                                                                                         If readbit
  159.                                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,white
  160.                                                                                         Else
  161.                                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,black
  162.                                                                                         EndIf
  163.                                                                                         xpos = xpos + 1
  164.                                                                                 Next
  165.                                                                         Next
  166.                                                                         skip = ReadShort(icofile) ; skip pad bytes
  167.                                                                 Next
  168.                                                         EndIf
  169.                                                 EndIf
  170.                                         EndIf
  171.                                         UnlockBuffer
  172.                                 EndIf
  173.                                 CloseFile icofile
  174.                                 Return newimage
  175.                                
  176.                         Case 8
  177.                                 ;read pallette
  178.                                 For color_value = 0 To 255
  179.                                         For RGB = 0 To 2
  180.                                                 readval = ReadByte(icofile)
  181.                                                 pallette256(color_value,RGB) = readval
  182.                                         Next
  183.                                         useless = ReadByte(icofile) ;reserved byte
  184.                                 Next
  185.                                
  186.                                 ;draw image
  187.                                 If Not returnMask
  188.                                         newimage = CreateImage(biWidth,biHeight/2)
  189.                                         SetBuffer ImageBuffer(newimage)
  190.                                         LockBuffer
  191.                                         For ycount = biHeight/2 To 1 Step -1
  192.                                                 For xcount = 1 To biWidth
  193.                                                         readval = ReadByte(icofile)
  194.                                                         WritePixelFast xcount - 1,ycount - 1,argb(pallette256(readval,2),pallette256(readval,1),pallette256(readval,0))
  195.                                                 Next
  196.                                         Next                           
  197.                                         UnlockBuffer
  198.                                 ;read AND mask
  199.                                 Else
  200.                                         SeekFile(icofile,icodwImageOffset + biSize + (2^biBitCount * 4) + (biWidth ^ 2))
  201.                                         newimage = CreateImage(biWidth,biHeight/2)
  202.                                         SetBuffer ImageBuffer(newimage)
  203.                                         LockBuffer
  204.                                         If biWidth = 32
  205.                                                 For ycount = biHeight/2 To 1 Step -1
  206.                                                         For xcount = 0 To 3
  207.                                                                 readval = ReadByte(icofile)
  208.                                                                 xpos = 0
  209.                                                                 For bits = 8 To 1 Step -1
  210.                                                                         readbit = (readval And (2^bits - 1)) Shr (bits - 1)
  211.                                                                         If readbit
  212.                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,white
  213.                                                                         Else
  214.                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,black
  215.                                                                         EndIf
  216.                                                                         xpos = xpos + 1
  217.                                                                 Next
  218.                                                         Next
  219.                                                 Next
  220.                                         Else
  221.                                                 If biWidth = 16
  222.                                                         For ycount = biHeight/2 To 1 Step -1
  223.                                                                 For xcount = 0 To 1
  224.                                                                         readval = ReadByte(icofile)
  225.                                                                         xpos = 0
  226.                                                                         For bits = 8 To 1 Step -1
  227.                                                                                 readbit = (readval And (2^bits - 1)) Shr (bits - 1)
  228.                                                                                 If readbit
  229.                                                                                         WritePixelFast (xcount * 8) + xpos,ycount - 1,white
  230.                                                                                 Else
  231.                                                                                         WritePixelFast (xcount * 8) + xpos,ycount - 1,black
  232.                                                                                 EndIf
  233.                                                                                 xpos = xpos + 1
  234.                                                                         Next
  235.                                                                 Next
  236.                                                                 skip = ReadShort(icofile)
  237.                                                         Next
  238.                                                 Else
  239.                                                         If biWidth = 48
  240.                                                                 For ycount = biHeight/2 To 1 Step -1
  241.                                                                         For xcount = 0 To 5
  242.                                                                                 readval = ReadByte(icofile)
  243.                                                                                 xpos = 0
  244.                                                                                 For bits = 8 To 1 Step -1
  245.                                                                                         readbit = (readval And (2^bits - 1)) Shr (bits - 1)
  246.                                                                                         If readbit
  247.                                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,white
  248.                                                                                         Else
  249.                                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,black
  250.                                                                                         EndIf
  251.                                                                                         xpos = xpos + 1
  252.                                                                                 Next
  253.                                                                         Next
  254.                                                                         skip = ReadShort(icofile)
  255.                                                                 Next
  256.                                                         EndIf
  257.                                                 EndIf
  258.                                         EndIf
  259.                                         UnlockBuffer
  260.                                 EndIf
  261.                                 CloseFile icofile
  262.                                 Return newimage
  263.        
  264.                         Case 24 ; no pallette info for 24-bit icon
  265.                                 If Not returnmask
  266.                                         newimage = CreateImage(biWidth,biHeight/2)
  267.                                         SetBuffer ImageBuffer(newimage)
  268.                                         LockBuffer
  269.                                         For ycount = biHeight/2 To 1 Step -1
  270.                                                 For xcount = 1 To biWidth
  271.                                                         readblue = ReadByte(icofile) ; colors stored backwards
  272.                                                         readgreen = ReadByte(icofile)
  273.                                                         readred = ReadByte(icofile)
  274.                                                         WritePixelFast xcount - 1,ycount - 1,argb(readred,readgreen,readblue)
  275.                                                 Next
  276.                                         Next                           
  277.                                         UnlockBuffer
  278.                                 Else
  279.                                         SeekFile(icofile,icodwImageOffset + biSize + (biWidth ^ 2 * 3))
  280.                                         newimage = CreateImage(biWidth,biHeight/2)
  281.                                         SetBuffer ImageBuffer(newimage)
  282.                                         LockBuffer
  283.                                         If biWidth = 32
  284.                                                 For ycount = biHeight/2 To 1 Step -1
  285.                                                         For xcount = 0 To 3
  286.                                                                 readval = ReadByte(icofile)
  287.                                                                 xpos = 0
  288.                                                                 For bits = 8 To 1 Step -1
  289.                                                                         readbit = (readval And (2^bits - 1)) Shr (bits - 1)
  290.                                                                         If readbit
  291.                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,white
  292.                                                                         Else
  293.                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,black
  294.                                                                         EndIf
  295.                                                                         xpos = xpos + 1
  296.                                                                 Next
  297.                                                         Next
  298.                                                 Next
  299.                                         Else
  300.                                                 If biWidth = 16
  301.                                                         For ycount = biHeight/2 To 1 Step -1
  302.                                                                 For xcount = 0 To 1
  303.                                                                         readval = ReadByte(icofile)
  304.                                                                         xpos = 0
  305.                                                                         For bits = 8 To 1 Step -1
  306.                                                                                 readbit = (readval And (2^bits - 1)) Shr (bits - 1)
  307.                                                                                 If readbit
  308.                                                                                         WritePixelFast (xcount * 8) + xpos,ycount - 1,white
  309.                                                                                 Else
  310.                                                                                         WritePixelFast (xcount * 8) + xpos,ycount - 1,black
  311.                                                                                 EndIf
  312.                                                                                 xpos = xpos + 1
  313.                                                                         Next
  314.                                                                 Next
  315.                                                                 skip = ReadShort(icofile)
  316.                                                         Next
  317.                                                 Else
  318.                                                         If biWidth = 48
  319.                                                                 For ycount = biHeight/2 To 1 Step -1
  320.                                                                         For xcount = 0 To 5
  321.                                                                                 readval = ReadByte(icofile)
  322.                                                                                 xpos = 0
  323.                                                                                 For bits = 8 To 1 Step -1
  324.                                                                                         readbit = (readval And (2^bits - 1)) Shr (bits - 1)
  325.                                                                                         If readbit
  326.                                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,white
  327.                                                                                         Else
  328.                                                                                                 WritePixelFast (xcount * 8) + xpos,ycount - 1,black
  329.                                                                                         EndIf
  330.                                                                                         xpos = xpos + 1
  331.                                                                                 Next
  332.                                                                         Next
  333.                                                                         skip = ReadShort(icofile)
  334.                                                                 Next
  335.                                                         EndIf
  336.                                                 EndIf
  337.                                                          
  338.                                         EndIf
  339.                                                  
  340.                                         UnlockBuffer
  341.                                 EndIf
  342.                                 CloseFile icofile
  343.                                 Return newimage
  344.                                
  345.                         End Select
  346.                 EndIf
  347.         Next
  348. End Function
  349.  
  350. Function argb(red,green,blue)
  351.         Return (blue Or (green Shl 8) Or (red Shl 16) Or ($ff Shl 24))
  352. End Function


Comments :


Mikorians(Posted 1+ years ago)

 Here's a better demo of his great include that actually RUNS...
Code: [Select]
Include "loadICOfile.bb"

Graphics 800,600,32,0
this$ = "D:Documents and SettingsBalloon.ico"

canvas = loadicoimage(this$,1,False)

SetBuffer BackBuffer()
ClsColor 128,128,128
Cls

DrawImage canvas,100,100
Flip

WaitKey()
End


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal