Images with transparence supported - Alpha blending adjustable
A free rotate tool look here :
viewtopic.php?f=12&t=77028&p=568342#p568342
Code: Select all
DeclareModule RotateImageSimple
EnableExplicit
; degree = 0 / -90 / 90 / 180 / 270 / Mirror h = -1 - v = -2
; This is a part of GFX_Wizzard_BF - By Saki
; This basic code can be used freely and also adapted as desired
Declare RotateImageSimple_BF(degree, image_ID, alpha=255)
EndDeclareModule
Module RotateImageSimple
Procedure Mirroring_V_BF(image_ID) ; PB573 - Mirroring on WinOS has a VectorLib Bug and is replaced
Protected i, ii, iii
If StartDrawing(ImageOutput(image_ID))
Protected lines=ImageHeight(image_ID)
Protected *buffer=DrawingBuffer()
Protected pitch=DrawingBufferPitch()
Protected *line_buffer_1=AllocateMemory(pitch)
Protected *line_buffer_2=AllocateMemory(pitch)
StopDrawing()
ii=pitch*lines: lines>>1-1
For i=0 To lines
ii-pitch
CopyMemory(*buffer+iii, *line_buffer_1, pitch)
CopyMemory(*buffer+ii, *line_buffer_2, pitch)
CopyMemory(*line_buffer_1, *buffer+ii, pitch)
CopyMemory(*line_buffer_2, *buffer+iii, pitch)
iii+pitch
Next i
FreeMemory(*line_buffer_1)
FreeMemory(*line_buffer_2)
Else
ProcedureReturn -4
EndIf
ProcedureReturn 1
EndProcedure
Procedure Mirroring_H_BF(image_ID) ; PB573 - Mirroring on WinOS has a VectorLib Bug and is replaced
Protected i, ii
Protected lines=ImageWidth(image_ID)
Protected image_height=ImageHeight(image_ID)
Protected line_buffer_1_ID, line_buffer_2_ID
If StartDrawing(ImageOutput(image_ID))
Protected pixel_format.a=DrawingBufferPixelFormat()
If pixel_format.a=>32
Protected image_32=#True
EndIf
ii=lines-1 : lines>>1-1
For i=0 To lines
line_buffer_1_ID=GrabDrawingImage(#PB_Any, i, 0, 1, image_height)
If Not line_buffer_1_ID : StopDrawing() : ProcedureReturn -6 : EndIf
line_buffer_2_ID=GrabDrawingImage(#PB_Any, ii, 0, 1, image_height)
If Not line_buffer_2_ID
StopDrawing()
FreeImage(line_buffer_1_ID)
EndIf
If image_32
DrawingMode(#PB_2DDrawing_AllChannels)
Box(ii, 0, 1, image_height, 0)
Box(i, 0, 1, image_height, 0)
DrawAlphaImage(ImageID(line_buffer_1_ID), ii, 0)
DrawAlphaImage(ImageID(line_buffer_2_ID), i, 0)
Else
DrawImage(ImageID(line_buffer_1_ID), ii, 0)
DrawImage(ImageID(line_buffer_2_ID), i, 0)
EndIf
FreeImage(line_buffer_1_ID)
FreeImage(line_buffer_2_ID)
ii-1
Next i
StopDrawing()
Else
ProcedureReturn -4
EndIf
ProcedureReturn 1
EndProcedure
Procedure RotateImageSimple_BF(degree, image_ID, alpha=255)
If Not IsImage(image_ID) : ProcedureReturn -6 : EndIf
If StartDrawing(ImageOutput(image_ID)) ; Get the Pixel format
Define pixel_format.a=DrawingBufferPixelFormat()
If pixel_format.a=>32
Protected alpha_image=#True
EndIf
StopDrawing()
EndIf
If alpha<>255 And Not alpha_image : alpha=255 : EndIf
If Abs(degree)<>90 And degree<>180 And degree<>270 And degree<>-1 And degree<>-2 : degree=0 : EndIf
Protected image_width=ImageWidth(image_ID), image_height=ImageHeight(image_ID)
If degree=-1 Or degree=-2
If image_width>image_height
Protected enlarge_temp_image=image_width
Else
enlarge_temp_image=image_height
EndIf
Else
Protected enlarge=3
If image_width>image_height
enlarge_temp_image=image_width+enlarge
Else
enlarge_temp_image=image_height+enlarge
EndIf
EndIf
enlarge-Bool(#PB_Compiler_OS<>#PB_OS_Windows)
If alpha_image
If (Abs(degree)=90 Or degree=270) And Not (degree=-1 Or degree=-2)
Protected new_image_ID=CreateImage(#PB_Any, image_height, image_width, 32, #PB_Image_Transparent)
Else
new_image_ID=CreateImage(#PB_Any, image_width, image_height, 32, #PB_Image_Transparent)
EndIf
Protected temp_image_ID=CreateImage(#PB_Any, enlarge_temp_image, enlarge_temp_image, 32, #PB_Image_Transparent)
Else
If (Abs(degree)=90 Or degree=270) And Not (degree=-1 Or degree=-2)
new_image_ID=CreateImage(#PB_Any, image_height, image_width)
Else
new_image_ID=CreateImage(#PB_Any, image_width, image_height)
EndIf
temp_image_ID=CreateImage(#PB_Any, enlarge_temp_image, enlarge_temp_image)
EndIf
If Not new_image_ID : ProcedureReturn -6 : EndIf
If Not temp_image_ID : FreeImage(temp_image_ID) : ProcedureReturn -6 : EndIf
If Not StartDrawing(ImageOutput(temp_image_ID))
FreeImage(new_image_ID) : FreeImage(temp_image_ID)
ProcedureReturn -4
EndIf
DrawAlphaImage(ImageID(image_ID), 1, 1)
StopDrawing()
If Not StartVectorDrawing(ImageVectorOutput(new_image_ID))
FreeImage(new_image_ID) : FreeImage(temp_image_ID)
ProcedureReturn -4
EndIf
Macro macro_case
; CompilerIf #PB_Compiler_OS<>#PB_OS_Windows
; Case -1
; FlipCoordinatesX(VectorOutputWidth()/2)
; MovePathCursor(-1, -1)
; Case -2
; FlipCoordinatesY(VectorOutputHeight()/2)
; MovePathCursor(-1, -1)
; CompilerElse
Case -1 ; Very faster as the Vector Lib
MovePathCursor(0, 0)
DrawVectorImage(ImageID(image_ID), alpha)
Protected result=Mirroring_H_BF(new_image_ID)
If result<1 : FreeImage(new_image_ID) : FreeImage(temp_image_ID) : ProcedureReturn result : EndIf
Case -2 ; Faster as the Vector Lib
MovePathCursor(0, 0)
DrawVectorImage(ImageID(image_ID), alpha)
result=Mirroring_V_BF(new_image_ID)
If result<1 : FreeImage(new_image_ID) : FreeImage(temp_image_ID) : ProcedureReturn result : EndIf
; CompilerEndIf
EndMacro
Select degree
Case 0
MovePathCursor(-1, -1)
Case -90, 270
RotateCoordinates(ImageWidth(temp_image_ID), ImageHeight(temp_image_ID), 270)
If image_height>image_width
MovePathCursor(ImageWidth(temp_image_ID)+(image_height-image_width)+enlarge, -1)
Else
MovePathCursor(ImageWidth(temp_image_ID)+enlarge, -1)
EndIf
Case 90
RotateCoordinates(ImageWidth(temp_image_ID), ImageHeight(temp_image_ID), 90)
If image_height>image_width
MovePathCursor(-1, ImageHeight(temp_image_ID)+enlarge)
Else
MovePathCursor(-1, ImageWidth(temp_image_ID)+image_width-image_height+enlarge)
EndIf
Case 180
RotateCoordinates(ImageWidth(temp_image_ID), ImageHeight(temp_image_ID), 180)
If image_height>image_width
MovePathCursor(ImageWidth(temp_image_ID)+image_height-image_width+enlarge, ImageWidth(temp_image_ID)+enlarge)
Else
MovePathCursor(ImageWidth(temp_image_ID)+enlarge, ImageWidth(temp_image_ID)+image_width-image_height+enlarge)
EndIf
macro_case
EndSelect
DrawVectorImage(ImageID(temp_image_ID), alpha)
StopVectorDrawing()
FreeImage(temp_image_ID)
ProcedureReturn new_image_ID
EndProcedure
EndModule
UseModule RotateImageSimple
CompilerIf #PB_Compiler_IsMainFile
; ###### Get the result ######
EnableExplicit
UsePNGImageDecoder() : UseJPEGImageDecoder() : UseTIFFImageDecoder() : UseGIFImageDecoder()
Define window_ID=OpenWindow(#PB_Any, 0, 0, 1200, 800, "Rotate and Mirror",
#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
SetWindowColor(window_ID, #Green)
Define canvas_ID=CanvasGadget(#PB_Any, 10, 50, WindowWidth(window_ID)-20, WindowHeight(window_ID)-60)
SetGadgetColor(canvas_ID, #PB_Gadget_BackColor, $909090)
Define box_width=260
Define box_height=290
Define image_ID=CreateImage(#PB_Any, box_width, box_height, 24, #White)
StartDrawing(ImageOutput(image_ID))
DrawingMode(#PB_2DDrawing_Outlined)
BackColor(#White)
DrawText(20, 20, " Top left ", #Black)
Box(0, 0, box_width, box_height, #Red)
StopDrawing()
ButtonGadget(1,10,10,55,25," 0 ")
ButtonGadget(2,70,10,55,25,"-90")
ButtonGadget(3,130,10,55,25," 90")
ButtonGadget(4,190,10,55,25,"180")
ButtonGadget(5,250,10,55,25,"270")
ButtonGadget(6,310,10,55,25," H ")
ButtonGadget(7,370,10,55,25," V ")
ButtonGadget(8,430,10,120,25," Load a image ")
Macro Macro_draw_image
ResizeGadget(canvas_ID, #PB_Ignore, #PB_Ignore, WindowWidth(window_ID)-20, WindowHeight(window_ID)-60)
If StartDrawing(CanvasOutput(canvas_ID))
If IsImage(image_1_ID)
Box(0, 0, WindowWidth(window_ID), WindowHeight(window_ID), $909090)
DrawAlphaImage(ImageID(image_1_ID),
GadgetWidth(canvas_ID)/2-ImageWidth(image_1_ID)/2,
GadgetHeight(canvas_ID)/2-ImageHeight(image_1_ID)/2)
EndIf
StopDrawing()
EndIf
EndMacro
SetGadgetColor(canvas_ID, #PB_Gadget_BackColor, $909090)
Define image_1_ID=RotateImageSimple_BF(0, image_ID, 255) ; degree = 0 / -90 / 90 / 180 / 270 / Mirror h = -1 - v = -2
Macro_draw_image
Repeat
Define Event=WaitWindowEvent()
If Event=#PB_Event_SizeWindow
Macro_draw_image
EndIf
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 1
Define image_1_ID=RotateImageSimple_BF(0, image_ID, 255)
Macro_draw_image
Case 2
image_1_ID=RotateImageSimple_BF(-90, image_ID, 255)
Macro_draw_image
Case 3
image_1_ID=RotateImageSimple_BF(90, image_ID, 255)
Macro_draw_image
Case 4
image_1_ID=RotateImageSimple_BF(180, image_ID, 255)
Macro_draw_image
Case 5
image_1_ID=RotateImageSimple_BF(270, image_ID, 255)
Macro_draw_image
Case 6
image_1_ID=RotateImageSimple_BF(-1, image_ID, 255)
Macro_draw_image
Case 7
image_1_ID=RotateImageSimple_BF(-2, image_ID, 255)
Macro_draw_image
Case 8
Define path$=OpenFileRequester("Load a Image", "", "", 0)
If FileSize(path$)>0
FreeImage(image_ID)
image_ID=LoadImage(#PB_Any, path$)
Define image_1_ID=RotateImageSimple_BF(0, image_ID, 255)
Macro_draw_image
StopDrawing()
EndIf
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
CompilerEndIf