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
(hPngnewXnewYnewWnewH)
  Protected 
ImageWidth(hPng)
  Protected 
ImageHeight(hPng)
  Protected 
hPngPart #PB_Any
  
Dim pix(wh)
  
hPngPart CreateImage(#PB_Any, w, h, 32)
  
StartDrawing(ImageOutput(hPng))
  
DrawingMode(#PB_2DDrawing_AlphaChannel)
  
Protected pxya
  
For 0 To newH 1
    
For 0 To newW 1
      p 
Point(newXnewY)
      
pix(xy) = RGBA(Red(p), Green(p), Blue(p), Alpha(p))
    
Next
  Next
  StopDrawing
()
  
0
  y 
1
  StartDrawing
(ImageOutput(hPngPart))
  
DrawingMode(#PB_2DDrawing_AlphaChannel)
  
Protected *pixel.TArgb DrawingBuffer()
  Protected *
ends = *pixel + (4
  While (*
pixel < *ends)
    
pix(xy)
    *
pixel\Alpha(p)
    *
pixel\Red(p)
    *
pixel\Green(p)
    *
pixel\Blue(p)
    *
pixel 4
    x 
1
    
If >= 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(hPngPartnewWnewH#PB_Image_Raw)
  
EndIf
  
FreeArray(pix())
  
ProcedureReturn hPngPart
EndProcedure 



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

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