Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как работает функция GetDIBits [D7, WinXP]


aKirill.INFO ©   (2006-09-11 11:13:00) 

Пробую симулировать работу GetDIBits, но чтото нето выходит:
type
 TRGB32 = packed record
   B, G, R, A: Byte;
 end;
 TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32;
 PRGB32Array = ^TRGB32Array;

var
  x,y: Integer;
  Data: PByteArray;
  pl: PRGB32Array;
begin

       Bitmap.handletype := bmDib;
       Bitmap.PixelFormat := pf32bit;
    try
     for y := biHeight - 1 downto 0 do
     begin
       pl := Bitmap.ScanLine[y];
       for x := 0 to biWidth - 1 do
       begin
         Data[(y*biHeight)+(x*3)] := pl[x].R;
         Data[(y*biHeight)+(x*3)+1] := pl[x].R;
         Data[(y*biHeight)+(x*3)+2] := pl[x].R;
       end;
     end;
    except
      on e: Exception do
       ShowMessage(e.Message);
    end;


aKirill.INFO   (2006-09-12 06:42:00) [1]

Спасибо уже все сделал


SamBrook   (2006-09-12 01:47:00) [2]


> for y := biHeight - 1 downto 0 do
>      begin
>        pl := Bitmap.ScanLine[y];
>        for x := 0 to biWidth - 1 do
>        begin
>          Data[(y*biHeight)+(x*3)] := pl[x].R;
>          Data[(y*biHeight)+(x*3)+1] := pl[x].R;
>          Data[(y*biHeight)+(x*3)+2] := pl[x].R;
>        end;
>      end;

В тексте 3 ошибки:
1. Кто память под DATA резервировать будет?
2.   Data[(y*biHeight)+(x*3)]   если читаем по 3 байта то не (y*biHeight) а (y*3*biWidth).
3. Какой смысл 3 раза подряд читать одно и  то же значение?


aKirill.INFO   (2006-09-11 11:58:00) [3]

Это продолжение, этого вопроса:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1157683616&n=7

Вроде как все правильно, нюанс что на NVIDIA начинает со второго раза это проявляться, а на карточках от ATI может и спервого захода проявиться касяк.


MBo   (2006-09-11 11:48:00) [4]

>воторй начинает глючить
Может, неправильно используешь?


aKirill.INFO   (2006-09-11 11:41:00) [5]

GetDIBits используеться в цикле, первый заход норамльно отробатывает, а воторй начинает глючить, если несколько раз подрят, то какойто раз все картинки всетаки нормально обработает


MBo   (2006-09-11 11:37:00) [6]

Что ты хочешь сделать, и почему бы не воспользоваться GetDIBits?


aKirill.INFO   (2006-09-11 11:35:00) [7]

А можно чуток поподробней с примером, пожалуйста.


MBo   (2006-09-11 11:20:00) [8]

Data[(y*biHeight) - неправильно, y нужно умножать на длину строки в байтах (для 3 бит - Width*4)


Наверх

Титульная страница Поиск, карта сайта Написать письмо