I solved a similar question (rotating an InkPicture) reading the information in MSDN for calling Windows APIs
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-stretchblt
permits to scale an image, this and many other functions for graphical actions are explained for C++ code, but you can more or less complex translation to PB, the most hard task it's for determine the type of parameters for trespassing to.
The website https://www.topwizprogramming.com/freecode_bitmap.html have free code where you can start to learn how do it this.
You must employ an amount of hours, but I think greatful because finally you learn to manage the graphs and you can see that many questions as this can be resolved without external help or products. In my case, third party products are forbidden by the corp to develope and this was the final solution.
Unfortunately, I can share the complete code, because I have a confidentiality clause, only can share some ideas to direct your head to the correct direction.
A part of the image rotation code
...
CASE POS_ROTATED_RIGHT
lst_PolygonPoint[ 1 ].X = ll_Height
lst_PolygonPoint[ 1 ].Y = 0
lst_PolygonPoint[ 2 ].X = ll_Height
lst_PolygonPoint[ 2 ].Y = ll_Width
lst_PolygonPoint[ 3 ].X = 0
lst_PolygonPoint[ 3 ].Y = 0
END CHOOSE
IF ai_rotation = POS_ROTATED_RIGHT OR ai_rotation = POS_ROTATED_LEFT THEN
ll_Aux = lstr_Info.bmiHeader.biWidth
lstr_Info.bmiHeader.biWidth = lstr_Info.bmiHeader.biHeight / lstr_Info.bmiHeader.biYPelsPerMeter * lstr_Info.bmiHeader.biXPelsPerMeter
lstr_Info.bmiHeader.biHeight = ll_Aux / lstr_Info.bmiHeader.biXPelsPerMeter * lstr_Info.bmiHeader.biYPelsPerMeter
END IF
ll_hDC = CreateCompatibleDC( 0 )
ll_hBitmap = CreateDIBSection( 0, lstr_Info, DIB_RGB_COLORS, 0, 0, 0 )
SelectObject( ll_hDC, ll_hBitmap )
lb_result = PlgBlt( ll_hDC, lst_PolygonPoint, ll_hDCAux, 0, 0, ll_Width, ll_Height, 0, 0, 0 )
IF ai_rotation = POS_ROTATED_RIGHT OR ai_rotation = POS_ROTATED_LEFT THEN
ll_Aux = ll_Width
ll_Width = ll_Height
ll_Height = ll_Aux
END IF
lstr_Info.bmiHeader.biSize = INFO_SIZE
IF GetDIBits( ll_hDC, ll_hBitmap, 0, ll_Height, 0, lstr_Info, DIB_RGB_COLORS ) > 0 THEN
...
and a part of the local external function definition
...
Private &
Function boolean PlgBlt &
( longPtr hdcDest &
, Ref lpPoint lpPoint[3] &
, longPtr hdcSrc &
, long nXSrc &
, long nYSrc &
, long nWidth &
, long nHeight &
, longptr hbmMask &
, long nXMask &
, long nYMask &
) Library 'gdi32.dll'
...
I hope that you can do it easily