Показать сообщение отдельно
Старый 25.12.2011, 15:14   #1
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
GrabPNG - копирование куска картинки с сохранением прозрачности

понадобилось извлекать часть png-картинки, но GrabImage валит альфа-канал. пришлось писать свою функцию, которая почти полностью повторяет кусок кода из wndSkin. проблема в том, что выглядит она нелепо, ибо получить доступ к пикселам другим способом у меня не вышло. я честно пытался хотябы избавиться от структуры TArgb, но... может, посоветуете, как это оптимизировать?

функция возвращает участок картинки hPng, извлеченный из указанных коррдинат x, y, w, h.
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 
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
(Offline)
 
Ответить с цитированием