Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > PureBasic

PureBasic Мощный кросс-платформенный язык среднего уровня на основе BASIC. Подходит для решения широкого круга задач.

Ответ
 
Опции темы
Старый 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com