forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PureBasic (http://forum.boolean.name/forumdisplay.php?f=90)
-   -   GrabPNG - копирование куска картинки с сохранением прозрачности (http://forum.boolean.name/showthread.php?t=16093)

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 



Часовой пояс GMT +4, время: 23:49.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot