Voici une idée de réponse pour transformer l'image en 256 niveaux. L'algorithme rend effectivement un résultat en 256 couleurs.
On peut perfectionner la chose du point de vue de l'algo de transformation.
Reste à ajouter éventuellement la création de la palette correspondante si on veut effectivement créer le fichier image en 256 niveaux.
Code : Tout sélectionner
Enumeration
#Window_Main
#Image
#Gadget_Image
#Gadget_Button_Select
#Gadget_Button_Modify
#Gadget_TrackBar_Text
#Gadget_TrackBar
EndEnumeration
Procedure SetColor256(Image.l, Brightness.f)
Beep_(440, 10)
UseImage(Image)
StartDrawing(ImageOutput())
ImageWidth = ImageWidth()
ImageHeight = ImageHeight()
Dim Pixels(ImageWidth - 1, ImageHeight - 1)
For x = 0 To ImageWidth - 1
For y = 0 To ImageHeight - 1
;
; Each point corresponds to a $FFFFFF color transformed from $RRGGBB to $RR + $GG + $BB limited to 255
; As a result we have finally 0-255 possible values.
;
; The $FF result is then transformed to $FFFFFF for a grey / white / black colorset
;
; The brightness variable allows to shadow / enhance the effect
;
Value = Point(x, y)
Value = Red(Value) * Brightness + Green(Value) * Brightness + Blue(Value) * Brightness
If Value > 255
Value = 255
EndIf
Value = RGB(Value, Value, Value)
Pixels(x, y) = Value
Next
Next
StopDrawing()
ImageID = CreateImage(#Image, ImageWidth, ImageHeight)
StartDrawing(ImageOutput())
For x = 0 To ImageWidth - 1
For y = 0 To ImageHeight - 1
Plot(x, y, Pixels(x, y))
Next
Next
StopDrawing()
Beep_(440, 50)
ProcedureReturn ImageID
EndProcedure
;
;
;
UseJPEGImageDecoder()
WindowWidth = 640
WindowHeight = 480
ImageWidth = WindowWidth
ImageHeight = WindowHeight - 40
If OpenWindow(#Window_Main, 0, 0, WindowWidth, WindowHeight + 20, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "MyWindow")
AddKeyboardShortcut(#Window_Main, #PB_Shortcut_Escape, #PB_Shortcut_Escape)
AddKeyboardShortcut(#Window_Main, #PB_Shortcut_F1, #PB_Shortcut_F1)
If CreateGadgetList(WindowID(#Window_Main))
ImageGadget(#Gadget_Image, 0, 40, ImageWidth, ImageHeight, CreateImage(#Image, ImageWidth, ImageHeight))
ButtonGadget(#Gadget_Button_Select, 10, 10, 80, 20, "Select image")
ButtonGadget(#Gadget_Button_Modify, 100, 10, 80, 20, "Modify image")
SetGadgetFont(#PB_Any, LoadFont(0, "Verdana", 7, #PB_Font_HighQuality))
TextGadget(#Gadget_TrackBar_Text, 200, 0, 100, 10, "n = 0.50",#PB_Text_Center)
TrackBarGadget(#Gadget_TrackBar, 200, 15, 100, 10, 0, 20, #PB_TrackBar_Ticks) ; TrackBar state will be transformed to a 0.0 - 2.0 range value with a 0.1 step.
SetGadgetState(#Gadget_TrackBar, 6)
EndIf
Quit = #FALSE
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = #TRUE
Case #PB_Event_Menu
Select EventMenuID()
Case #PB_Shortcut_Escape
Quit = #TRUE
Case #PB_Shortcut_F1
Statistics = 1 - Statistics
EndSelect
Case #PB_Event_Gadget
Select EventGadgetID()
Case #Gadget_Button_Select
FileName.s = OpenFileRequester("Please choose file to load", "Image.jpg", "Graphical files BMP JPEG|*.bmp;*.jpg;*.jpeg|*.*", Pattern)
SetGadgetState(#Gadget_Image, LoadImage(#Image, FileName))
Case #Gadget_Button_Modify
ImageGadget(#Gadget_Image, 0, 40, ImageWidth, ImageHeight, SetColor256(#Image, (2 * GetGadgetState(#Gadget_TrackBar) / 20)))
Case #Gadget_TrackBar
SetGadgetText(#Gadget_TrackBar_Text, "n = " + StrF(2 * GetGadgetState(#Gadget_TrackBar) / 20, 2))
EndSelect
EndSelect
Until Quit
EndIf
End