Как ускорить работу кода? Пиксельная цветокоррекция битмапов

Раздел посвящен программированию с использованием Power Basic.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Как ускорить работу кода? Пиксельная цветокоррекция битмапов

Сообщение jangle » 08.11.2007 (Чт) 17:50

Есть такой код, читается картинка, попиксельно раскадывается на RGB. Затем для каждого пикселя увеличиваем Red, уменьшаем Green, увеличиваем Blue. Складываем цвета заново, формируем битмап в памяти и сохраняем его на диск. Все работает, но медленно, как можно ускорить работу этого кода?

Код: Выделить всё
#Compile Exe
#Dim All
#Include "win32api.inc"


Function PBMain () As Long
  Local hbmp As Dword
  Local hbmpwin As Dword
  Local x As Dword
  Local y As Dword
  Local rgbColor As Dword
  Local temp As String
  Local total_red As Long
  Local total_green As Long
  Local total_blue As Long
  Local New_Pixel As Dword
  Local hNewBmp As Dword
  Local i As Dword
  Local t As Dword
  Dim Clr(640,480) As Dword

  Graphic Bitmap Load "dragon_black.bmp", 640, 480 To hbmp
  Graphic Attach hbmp, 0
  Graphic Window "", 0, 0, 640, 480 To hbmpwin
  Graphic Attach hbmpwin, 0
  Graphic Copy hbmp, 0
 
   For i=1 To 640
      For t=1 To 480
       Graphic Get Pixel (i, t) To rgbColor
       Clr (i,t)= rgbColor
      Next t
   Next i

  Graphic Bitmap New 640, 480 To hNewBmp
  Graphic Attach hNewBmp, 0


   For i=1 To 640
      For t=1 To 480
       temp = Right$("000000000000000000000000" + Bin$(Clr (i,t)),24)
       total_red   = total_red   + Val("&B" + Mid$(temp,17,8))
       total_green = total_green + Val("&B" + Mid$(temp,9,8))
       total_blue  = total_blue  + Val("&B" + Mid$(temp,1,8))
       New_Pixel=RGB(total_red+10, total_green-10, total_blue+10)
       Graphic Set Pixel  (i, t ), New_Pixel
       total_red=0
       total_green=0
       total_blue=0
      Next t
  Next i
  Kill "new_dragon.bmp"
  Graphic Save "new_dragon.bmp"

End Function           
Вложения
color.zip
(91.89 Кб) Скачиваний: 148

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 08.11.2007 (Чт) 20:02

Отказаться от стандартных функций и ручками загрузить битмап в память, после чего работать с бинарными данными. После чего самостоятельно же сохранить.
Изображение

Dingo
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 06.11.2007 (Вт) 19:00

Сообщение Dingo » 08.11.2007 (Чт) 20:15

keks-n прав.
Но вот тебе вариант "на скорую руку" средствами PB:
Код: Выделить всё
#COMPILE EXE
#DIM ALL

Type RGBpixel
   B as Byte
   G as Byte
   R as Byte
   A as Byte
End Type

Function PBMain () As Long

   Local hbmp As Dword
   Local PicStr As String
   Register x As Long
   Register y As Long
   
   Graphic Bitmap Load "dragon_black.bmp", 640, 480 To hbmp
   Graphic Attach hbmp, 0
   Graphic Get Bits to PicStr
 
   ReDim Pic(639,479) as RGBpixel at StrPtr(PicStr)+8

   For y = 0 to 479
      For x = 0 To 639
         Pic(x,y).R = Min&(Pic(x,y).R + 10,255)
         Pic(x,y).G = Max&(Pic(x,y).G - 10,0)
         Pic(x,y).B = Min&(Pic(x,y).B + 10,255)
   Next x, y
   
   Graphic Set Bits PicStr

   Kill "new_dragon2.bmp"
   Graphic Save "new_dragon2.bmp"

End Function

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 08.11.2007 (Чт) 21:51

Dingo писал(а):keks-n прав.
Но вот тебе вариант "на скорую руку" средствами PB:


Cпасибо, буду пробовать


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

    TopList