понадобилось извлекать часть png-картинки, но GrabImage валит альфа-канал. пришлось писать свою функцию, которая почти полностью повторяет кусок кода из wndSkin. проблема в том, что выглядит она нелепо, ибо получить доступ к пикселам другим способом у меня не вышло. я честно пытался хотябы избавиться от структуры TArgb, но... может, посоветуете, как это оптимизировать?
функция возвращает участок картинки hPng, извлеченный из указанных коррдинат x, y, w, h.
Structure TArgb
b.b
g.b
r.b
a.b
EndStructure
Procedure GrabPNG(hPng, newX, newY, newW, newH)
Protected w = ImageWidth(hPng)
Protected h = ImageHeight(hPng)
Protected hPngPart = #PB_Any
Dim pix(w, h)
hPngPart = CreateImage(#PB_Any, w, h, 32)
StartDrawing(ImageOutput(hPng))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Protected p, x, y, a
For y = 0 To newH - 1
For x = 0 To newW - 1
p = Point(x + newX, y + newY)
pix(x, y) = RGBA(Red(p), Green(p), Blue(p), Alpha(p))
Next
Next
StopDrawing()
x = 0
y = h - 1
StartDrawing(ImageOutput(hPngPart))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Protected *pixel.TArgb = DrawingBuffer()
Protected *ends = *pixel + (w * h * 4)
While (*pixel < *ends)
p = pix(x, y)
*pixel\a = Alpha(p)
*pixel\r = Red(p)
*pixel\g = Green(p)
*pixel\b = Blue(p)
*pixel + 4
x + 1
If x >= w
x = 0
y - 1
EndIf
Wend
StopDrawing()
FreeArray(pix())
If (newW <> #PB_Ignore)Or(newH <> #PB_Ignore)
If newW = #PB_Ignore
newW = w
EndIf
If newH = #PB_Ignore
newH = h
EndIf
ResizeImage(hPngPart, newW, newH, #PB_Image_Raw)
EndIf
FreeArray(pix())
ProcedureReturn hPngPart
EndProcedure