Change Contrast 4 Any Image [Windows]
Posted: Sat Nov 07, 2020 1:10 am
Based on ice-soft code
Edit : Bugs fixed
Code: Select all
UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UseTIFFImageDecoder()
UseTGAImageDecoder()
UseGIFImageDecoder()
#TBS_TOOLTIPS = $0100
#TBM_SETTOOLTIPS = $41D
#TTF_TRACK = $20
Macro CopyImageToBuffer(img, Buffer)
TemporaryBitmapInfo.BITMAPINFO
TemporaryDC = CreateDC_("DISPLAY", #Null, #Null, #Null)
GetObject_(ImageID(img), SizeOf(BITMAP), TemporaryBitmap.BITMAP)
TemporaryBitmapInfo\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
TemporaryBitmapInfo\bmiHeader\biWidth = TemporaryBitmap\bmWidth
TemporaryBitmapInfo\bmiHeader\biHeight = -TemporaryBitmap\bmHeight
TemporaryBitmapInfo\bmiHeader\biPlanes = 1
TemporaryBitmapInfo\bmiHeader\biBitCount = 32
TemporaryBitmapInfo\bmiHeader\biCompression = #BI_RGB
GetDIBits_(TemporaryDC, ImageID(img), 0, TemporaryBitmap\bmHeight, Buffer, TemporaryBitmapInfo.BITMAPINFO, #DIB_RGB_COLORS)
DeleteDC_(TemporaryDC)
EndMacro
Macro CopyBufferToImage(Buffer, img)
TemporaryBitmapInfo.BITMAPINFO
TemporaryDC = CreateDC_("DISPLAY", #Null, #Null, #Null)
GetObject_(ImageID(img), SizeOf(BITMAP), TemporaryBitmap.BITMAP)
TemporaryBitmapInfo\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
TemporaryBitmapInfo\bmiHeader\biWidth = TemporaryBitmap\bmWidth
TemporaryBitmapInfo\bmiHeader\biHeight = -TemporaryBitmap\bmHeight
TemporaryBitmapInfo\bmiHeader\biPlanes = 1
TemporaryBitmapInfo\bmiHeader\biBitCount = 32
TemporaryBitmapInfo\bmiHeader\biCompression = #BI_RGB
SetDIBits_(TemporaryDC, ImageID(img), 0, TemporaryBitmap\bmHeight, Buffer, TemporaryBitmapInfo.BITMAPINFO, #DIB_RGB_COLORS)
DeleteDC_(TemporaryDC)
EndMacro
Procedure.l LimitValues (x.l)
!mov eax,dword[p.v_x]
!xor edx,edx ; set EDX to zero
!cmp eax,0 ; compare with top limit
!cmovl eax,edx ;
!mov edx,255 ; 255
!cmp eax,edx ; compare with bottom limit
!cmovg eax,edx ; if lower, set value to bottom limit
ProcedureReturn
EndProcedure
Procedure.l AssignTables (Array RedTable.a(1), Array GreenTable.a(1), Array BlueTable.a(1), Array Bits.a(1), Width, Height)
Define.l LineWidth = Width * 4
Define.l h, w, i
For h = 0 To Height-1
For w = 0 To Width-1
i = h * LineWidth + 4 * w
Bits(i+2) = RedTable(Bits(i+2))
Bits(i+1) = GreenTable(Bits(i+1))
Bits( i ) = BlueTable(Bits( i ))
Next
Next
EndProcedure
Procedure Contrast (DImage,SImage,red.f,green.f,blue.f)
Protected TemporaryBitmapInfo.BITMAPINFO, TemporaryBitmap.BITMAP ,PicDestDC.l,PicSrcDC.l ,BitCount ,Width,Height,LineWidth =0
Define.l TemporaryDC
Width = ImageWidth(SImage)
Height = ImageHeight(SImage)
LineWidth = Width * 4
BitCount = LineWidth * Height
Dim Bits.a (BitCount)
CopyImageToBuffer(SImage, @Bits())
Define.l i
If Red < 0.0 : Red = 0.1 : EndIf
If Green < 0.0: Green = 0.1 : EndIf
If Blue < 0.0 : Blue = 0.1 : EndIf
Dim TableR.a(256)
Dim TableG.a(256)
Dim TableB.a(256)
For i = 0 To 255
TableR(i) = LimitValues (Int(((i - 127) * Red) + 127))
TableG(i) = LimitValues (Int(((i - 127) * Green) + 127))
TableB(i) = LimitValues (Int(((i - 127) * Blue) + 127))
Next
AssignTables (TableR(), TableG(), TableB(), Bits(), Width, Height)
CopyBufferToImage(@Bits(), DImage)
ReDim TableR.a(0)
ReDim TableG.a(0)
ReDim TableB.a(0)
EndProcedure
Pattern$ = "All supported formats|*.*;*.bmp; *.gif; *.jpg; *.jpeg; *.png;*.tif;*.tiff;*.tga|TGA image (*.tga)|*.tga|"+
"TIF image (*.tif)|*.tif|TIFF image (*.tiff)|*.tiff|PNG image (*.png)|*.png|BMP image (*.bmp)|*.bmp|"+
"JPEG image (*.jpg;*.jpeg)|*.jpg;*.jpeg|GIF image (*.gif)|*.gif|"
OpenWindow(0,0,0,800,600,"test",#PB_Window_SystemMenu |#PB_Window_ScreenCentered)
cont = ContainerGadget(#PB_Any,10,10,780,540,#PB_Container_Flat)
ButtonImageGadget(0,-1,-1,780,540,0,#PB_Image_Border)
CloseGadgetList()
DisableGadget(cont,1)
ButtonGadget(1,10,560,60,30,"Open")
ButtonGadget(2,80,560,60,30,"Save")
TrackBarGadget(3,150,562 ,645,24,0,255)
TTIP = CreateWindowEx_(0, #TOOLTIPS_CLASS, "", #TTS_NOPREFIX, 0, 0, 0, 0, WindowID(0), 0, GetModuleHandle_(0), 0)
ti.TOOLINFO
ti\cbSize = SizeOf(ti)
;ti\hWnd = WindowID(0)
ti\uFlags = #TTF_IDISHWND | #TTF_TRACK | #TTF_CENTERTIP
ti\uId = GadgetID(3)
Text$ = Str(GetGadgetState(3))
ti\lpszText = @Text$
SendMessage_(GadgetID(3), #TBM_SETTOOLTIPS, TTIP, 0)
SendMessage_(TTIP, #TTM_ADDTOOL, 0, @ti)
SetWindowLongPtr_(GadgetID(3),#GWL_STYLE,GetWindowLongPtr_(GadgetID(3),#GWL_STYLE)|#WS_VISIBLE | #WS_CHILD | #TBS_ENABLESELRANGE| #TBS_TOOLTIPS |#TBS_FIXEDLENGTH)
SendMessage_(GadgetID(3), #TBM_SETTHUMBLENGTH,25,0)
SetGadgetState(3,127)
scale.f = 1
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #WM_LBUTTONUP
GetCursorPos_(p.POINT)
If WindowFromPoint_(p\y << 32 + p\x) = GadgetID(3)
Text$ = Str(GetGadgetState(3))
ti\lpszText = @Text$
SendMessage_(TTIP, #TTM_UPDATETIPTEXT, 0, @ti)
SendMessage_(TTIP, #TTM_TRACKACTIVATE, 1, @ti)
EndIf
Case #WM_MOUSEMOVE
GetCursorPos_(p.POINT)
If WindowFromPoint_(p\y << 32 + p\x) = GadgetID(3)
Text$ = Str(GetGadgetState(3))
If text$ <> oldtext$
ti\lpszText = @Text$
SendMessage_(TTIP, #TTM_UPDATETIPTEXT, 0, @ti)
SendMessage_(TTIP, #TTM_TRACKACTIVATE, 1, @ti)
oldtext$ = text$
EndIf
Else
oldtext$ = ""
SendMessage_(TTIP, #TTM_TRACKACTIVATE, 0, @ti)
EndIf
Case #WM_MOUSEWHEEL
If IsImage(0)
CopyImage(0,1)
delta = EventwParam()>>16 & $FFFF
If delta = 120
If scale < 2
scale.f = scale.f + 0.05
EndIf
Else
If scale > 0.1
scale.f = scale.f - 0.05
EndIf
EndIf
ResizeImage(1,ImageWidth(0)*scale,ImageHeight(0)*scale)
SetGadgetState(3,127)
SetGadgetAttribute(0,#PB_Button_Image,ImageID(1))
EndIf
Case #PB_Event_Gadget
Select EventGadget()
Case 1
SetGadgetState(3,127)
If IsImage(0)
FreeImage(0)
EndIf
If IsImage(1)
FreeImage(1)
EndIf
If IsImage(2)
FreeImage(2)
EndIf
File$ = OpenFileRequester("Choose image file to load", "*.*", Pattern$, 0)
If File$ And FileSize(File$)
LoadImage(0,File$)
SetGadgetAttribute(0,#PB_Button_Image,ImageID(0))
EndIf
Case 2
Case 3
If IsImage(0)
color.f = GetGadgetState(3)/100
If IsImage(1)
CopyImage(1,2)
Contrast (2,1,color.f,color.f,color.f)
Else
CopyImage(0,2)
Contrast (2,0,color.f,color.f,color.f)
EndIf
SetGadgetAttribute(0,#PB_Button_Image,ImageID(2))
EndIf
EndSelect
EndSelect
Until Quit = 1