I wrote a small program to take an image and convert it to ascii. I find the for loop top be a little
slow. Is there anyway to speed this code up?
Not sure how to display the code in a message

Code: Select all
; load image
UsePNGImageDecoder()
UseJPEGImageDecoder()
Global image.i
Global myString.s = "@A#*+=-,. "
Global File.s
Global Font1.i
Enumeration DWMWINDOWATTRIBUTE
#DWMWA_USE_IMMERSIVE_DARK_MODE = 20
EndEnumeration
; https://docs.microsoft.com/en-us/windows/win32/api/dwmapi/nf-dwmapi-dwmsetwindowattribute
PrototypeC.i DwmSetWindowAttribute(hwnd.i, dwAttribute.l, *pvAttribute, cbAttribute.l)
Define.DwmSetWindowAttribute DwmSetWindowAttribute
Define.i UseDarkMode
Procedure Resize_Window_0()
Protected ScaleX.f, ScaleY.f
ResizeGadget(10, WindowWidth(0) - 180, WindowHeight(0) - 150, 100, 25)
EndProcedure
Procedure AverageColor(Color.i)
Define r.i, g.i, b.i, Average.i
r=Red(Color)
g= Green(Color)
b= Blue(Color)
average = (r + g + b) / 3
ProcedureReturn Average
EndProcedure
Procedure AsciiToIMage(File$)
Define S.s
Define x.i,y.i
Define Ratio.d
Define NewWidth.i
Define NewHeight.i
Define width.i
Define Height.i
Define Color.i
Define r.i
Define g.i
Define b.i
Define Average.i
Define CharIndex.i
Dim ASCII_CHARS.s(Len(myString))
For x = 1 To Len(myString)
Ascii_CHARS(x-1) = Mid(myString, x, 1)
Next
image = LoadImage( #PB_Any, File$ )
ratio=ImageHeight( image ) / ImageWidth( image )
NewWidth=256
NewHeight=Ratio * NewWidth;
If NewHeight<=0
NewHeight=256
EndIf
ResizeImage(image, NewWidth, NewHeight,#PB_Image_Smooth ) ;use new dimensions
ImageGadget(20, 1000, 10, NewWidth,NewHeight, ImageID(image))
SetGadgetState(20,ImageID(image)) ;update the image
width = ImageWidth( image )
height = ImageHeight( image )
StartDrawing( ImageOutput( image ) )
For y=0 To Height -1 ;Loop image height
For x = 0 To width - 1 ;Loop image width
Color=Point(x,y) ;Get pixel color
Average=AverageColor(Color) ;Get Average
If Average>0 And Average<>255
Plot(x,y,RGB(Average,Average,Average)) ;Turn to Gray scale
Color=RGB(Average,Average,Average) ;get the new color values
Average=AverageColor(Color) ;Get Average again
CharIndex= Average * Len(Mystring) / 256; ;Get index to chars
EndIf
If Average=255
Charindex=Len(MyString)
EndIf
S=S+ASCII_CHARS(CharIndex); ;Append new text
CharIndex=0
Next x
S=S+Chr(13)
Next y
StopDrawing()
AddGadgetItem(12, 0,S)
SetGadgetState(20,ImageID(image)) ;Show Gray scale image
EndProcedure
Procedure EventHandler()
Select Event()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
File = OpenFileRequester("Please choose image to load", "", "", 0)
If IsImage(image)
FreeImage(image)
EndIf
SetGadgetText(12, "")
AsciiToIMage(File)
EndSelect
EndProcedure
OpenWindow(0, 100, 10, 1280, 850, "ImageToAscii", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
SetWindowColor(0, RGB(32, 32, 32))
EditorGadget(12, 20,10, 539, 869)
Font1 = LoadFont(#PB_Any, "Courier New" , 2) ;need a mono font
SetGadgetFont(12, FontID(Font1))
ButtonGadget(10, 1100, 750, 100, 25, "Open Image")
BindGadgetEvent(10, @EventHandler())
BindEvent(#PB_Event_SizeWindow, @Resize_Window_0(), 0)
UseDarkMode = #True
If OpenLibrary(0, "dwmapi")
DwmSetWindowAttribute = GetFunction(0, "DwmSetWindowAttribute")
DwmSetWindowAttribute(WindowID(0), #DWMWA_USE_IMMERSIVE_DARK_MODE, @UseDarkMode, SizeOf(UseDarkMode))
CloseLibrary(0)
EndIf
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_CloseWindow ; If the user has pressed on the close button
Quit = 1
EndIf
Until Quit = 1
End
Thanks