Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.20;
Скачать: CL | DM;

Вниз

Как работает функция GetDIBits   Найти похожие ветки 

 
aKirill.INFO   (2006-09-11 11:13) [0]

Пробую симулировать работу 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;


 
MBo ©   (2006-09-11 11:20) [1]

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


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

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


 
MBo ©   (2006-09-11 11:37) [3]

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


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

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


 
MBo ©   (2006-09-11 11:48) [5]

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


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

Это продолжение, этого вопроса:
http://delphimaster.net/view/8-1157683616/

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


 
SamBrook ©   (2006-09-12 01:47) [7]


> 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-12 06:42) [8]

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



Страницы: 1 вся ветка

Текущий архив: 2007.05.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.032 c
15-1176757770
ArtemESC
2007-04-17 01:09
2007.05.20
PHP


15-1177295807
Slider007
2007-04-23 06:36
2007.05.20
С днем рождения ! 23 апреля


1-1173960784
kyn66
2007-03-15 15:13
2007.05.20
Горячие клавиши на форме!


3-1173159322
Atanas
2007-03-06 08:35
2007.05.20
Структура таблиц


2-1178270371
npu3pak
2007-05-04 13:19
2007.05.20
CheckListBox