#Include "windows.bi"
#Include Once "win/gdiplus.bi"

' открываем пространство имен GDI+
Using GDIPLUS 

Dim Shared ULONG_PTR_01 As ULONG_PTR ' указатель на маркер (token) , необходимый для функции GdiplusShutdown при завершении работы с GDI+
Dim GDIPLUSSTARTUPINPUT_01 As GDIPLUSSTARTUPINPUT 'вспомогательная структура для инициализации GDI+
' ставим версию GDI+
GDIPLUSSTARTUPINPUT_01.GdiplusVersion = 1
' Инициализация GDI+
If (GdiplusStartup(@ULONG_PTR_01, @GDIPLUSSTARTUPINPUT_01, NULL) <> 0) Then
	Print "FAIL"
EndIf

' функция загрузки изображения, взята из библиотеки window9
Function Load_imageA(ByVal ImagePath As String) As Any Ptr 
	' указатель на битмап GDI+
	Dim GPIMAGE_01 As GPBITMAP Ptr 
	' считаем длину строки в байтах для представления Unicode
	Var blen = (Len(ImagePath)*2)+2
	' Буфер для получения unicode строки
	Dim As WString Ptr wbuf
	' выделяем память для буфера
	wbuf  = Allocate( blen )
	' конвертируем строку в Unicode
	MultiByteToWideChar(CP_ACP, 0, ImagePath, -1, wbuf, blen)
	' Загружаем изображение
	If (GdipLoadImageFromFile( *wbuf, @GPIMAGE_01) <> 0) Then
		Print "FAIL"
	End If
	' освобождаем память буфера
	DeAllocate(wbuf)
	' возвращаем указатель на битмап GDI+
	Return GPIMAGE_01
End Function

Dim As Any Ptr hbmpSource ' хендл битмапа GDI+
Dim As BitmapData bitmapData ' вспомогательная структура для извлечения пикселей
Dim image As Any Ptr ' хендл изображения GFX
Dim pixels As Any Ptr ' адрес массива пикселей GFX
Dim As Rect rect ' структура для выделения области считывания пикселей GDI+
Dim As Integer w,h ' ширина и высота изображения
Dim As Integer pitch ' размер строки FbGfx
' Загружаем изображение
hbmpSource=Load_imageA("1.png")
' Если изображение не удалось загрузить, выходим из программы
If hbmpSource = 0 Then End
' Получаем размеры изображения
GdipGetImageWidth(hbmpSource,@w)
GdipGetImageHeight(hbmpSource,@h)
' Выделяем весь прямоугольник для считывания пикселей из GDI+
rect = Type(0, 0, w-1, h-1)

' Создаем 32-bit графический экран.
ScreenRes 320, 200, 32
' Создаем изображение GFX
image = ImageCreate( w, h )
'' Получаем доступ к пикселям gfx изображения и заодно размер каждой строки
ImageInfo( image,,,,pitch,pixels )

' Блокируем область для получения доступа к пикселям GDI+
GdipBitmapLockBits(hbmpSource,Cast(Any Ptr,@rect),ImageLockModeRead,PixelFormat32bppARGB,@bitmapData)
' Копируем пиксели в из GDI в GFX
For y As Integer = 0 To h-1
	Dim row As UInteger Ptr = pixels + y * pitch ' Получаем указатель на начало каждой строки
	For x As Integer = 0 To w-1
		row[x] = Cast(Integer Ptr,bitmapData.Scan0)[x+y*w] 'Копируем пиксели
	Next
Next
' Разблокировка области
GdipBitmapUnlockBits(hbmpSource,@bitmapData)
' Закрашиваем фон экрана зеленым цветом
Paint (10,10),&hff00ff55
' Рисуем изображение в двух различных координатах с прозрачностью
Put (10, 10), image,Alpha
Put (79, 69), image,Alpha
' удаляем изображение GFX
ImageDestroy( image )
' удаляем изображение GDI+
GdipDisposeImage(hbmpSource)
' высвобождаем GDI+
GdiplusShutdown (ULONG_PTR_01)
Sleep