понадобилось извлекать часть png-картинки, но GrabImage валит альфа-канал. пришлось писать свою функцию, которая почти полностью повторяет кусок кода из wndSkin. проблема в том, что выглядит она нелепо, ибо получить доступ к пикселам другим способом у меня не вышло. я честно пытался хотябы избавиться от структуры TArgb, но... может, посоветуете, как это оптимизировать?
функция возвращает участок картинки hPng, извлеченный из указанных коррдинат x, y, w, h.
![](images/chestnut/misc/code_php.gif)
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