![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как работает функция 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)