barsunduk |
25.12.2011 15:14 |
GrabPNG - копирование куска картинки с сохранением прозрачности
понадобилось извлекать часть png-картинки, но GrabImage валит альфа-канал. пришлось писать свою функцию, которая почти полностью повторяет кусок кода из wndSkin. проблема в том, что выглядит она нелепо, ибо получить доступ к пикселам другим способом у меня не вышло. я честно пытался хотябы избавиться от структуры TArgb, но... может, посоветуете, как это оптимизировать?
функция возвращает участок картинки hPng, извлеченный из указанных коррдинат x, y, w, h.
PHP код:
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
|