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

Вниз

Блокировка поверхности   Найти похожие ветки 

 
parovoZZ ©   (2004-08-15 01:48) [0]

Допустим, я хочу узнать цвет определённого пикселя на поверхности. Делаю сабж и попадаю в место, определённое цветовым ключом как прозрачное. Какой цвет я получу?


 
cyborg ©   (2004-08-15 08:44) [1]

Тот, который цветовой ключ.


 
parovoZZ ©   (2004-08-15 09:34) [2]

ихгым, спасибо


 
parovoZZ ©   (2004-08-15 12:17) [3]

Не пойму, что здесь не так. Цвета - 16 бит. Но даже при 32 битах не работает (при смещениях 8).

function BoomParticle (Width, Height : byte; X, Y, speed : single; iDDSurface : IDirectDrawSurface7) : hResult;
var
 i, j  : word;
desc   : TDDSURFACEDESC2;
hRet   : hResult;
Pixel  : Byte;

BEGIN
ZeroMemory (@desc, SizeOf (desc));
desc.dwSize := SizeOf (desc);
hRet := iDDSurface.Lock(nil, desc, DDLOCK_WAIT, 0);
if hRet <> DD_OK then
 begin
  result := hRet ;
  exit;
 end;

for i := 0 to Width do
 for j := 0 to Height do
  begin
   Pixel := PByte (Integer (desc.lpSurface) + j * desc.lPitch + i * (BitDepth div 8))^;
   if Pixel > 0 then
    begin
     Quantity := Quantity + 1;
     SetLength (Particles, Quantity);
     Particles [Quantity - 1].B := Pixel;// and $1F;
     Particles [Quantity - 1].G := (Pixel shr 5);// and $3F;
     Particles [Quantity - 1].R := (Pixel shr 11);// and $1F;
     Particles [Quantity - 1].X := X + i;
     Particles [Quantity - 1].Y := Y - j;
     Particles [Quantity - 1].Angle := random * 2 * Pi; //arccos ((i - X) / (j + Y));
     Particles [Quantity - 1].Speed := random * Speed;
     Particles [Quantity - 1].Time := Random (150) + 150;
     Particles [Quantity - 1].variable := false;
    end;
  end;

hRet := iDDSurface.Unlock (nil);
result := hRet;
END;


 
cyborg ©   (2004-08-15 14:58) [4]

Вот, вроде работает :), моя функция получения цвета пикселя (Фрипаскаль):


//Функция получения цвета точки
//Значения X,Y исчисляются с нуля (0,0 - для левого верхнего пикселя картинки)
//Для всех форматов пикселя поверхности (8, 16, 24, 32 бит):
Function GetColorXY(Var Surface : IDirectDrawSurface7; X,Y : Longint) : Cardinal;
Var
 Color : Cardinal;
 ddsd : TDDSurfaceDesc2;
 hRes : HRESULT;
 PixSize : Longint;
begin
 Color:=$00000000;
 ddsd.dwSize := SizeOf(ddsd);
 //Запираем поверхность
 //ddsd.lpSurface указывает на начало данных
 //ddsd.lPitch хранит реальную ширину поверхности
 hRes := Surface^^.Lock(Surface, nil, ddsd, 0, 0);
 if DD_OK = hRes then
 begin
   //Если координаты не выходят за пределы поверхности:
   if (X>=0) and (Y>=0) and (X<=ddsd.lPitch) and (Y<=ddsd.dwHeight) then
   Begin
   PixSize:=(ddsd.ddpfPixelFormat.dwRGBBitCount shr 3);
   //Читаем цвет и сдвигаем вправо (SHR) на нужное кол-во бит:
   Color:=(Cardinal(Pointer(Cardinal(ddsd.lpSurface)+((ddsd.lPitch*Y)+(X*PixSize-2)))^)) shr (32 - ddsd.ddpfPixelFormat.dwRGBBitCount);
   end;
   Surface^^.Unlock(Surface, nil);
 end;
 Result:=Color;
end;


Под Дельфи для своих нужд в цикле сам перепиши .


 
parovoZZ ©   (2004-08-15 20:09) [5]

Мда, у меня от этих сдвигов голова уже сдвинулась.


 
cyborg ©   (2004-08-16 08:30) [6]

:)
в общем тебе вот это нужно


PixSize:=(ddsd.ddpfPixelFormat.dwRGBBitCount shr 3);
  //Читаем цвет и сдвигаем вправо (SHR) на нужное кол-во бит:
  Color:=(Cardinal(Pointer(Cardinal(ddsd.lpSurface)+((ddsd.lPitch*Y)+(X*PixSize-2)))^)) shr (32 - ddsd.ddpfPixelFormat.dwRGBBitCount);

X,Y только свои подставь.



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

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

Наверх




Память: 0.48 MB
Время: 0.046 c
4-1097410364
Stany
2004-10-10 16:12
2004.11.21
запуск программы с обработкой кодов возврата


1-1099837483
snake1977
2004-11-07 17:24
2004.11.21
DropDown


1-1099473927
Leaner
2004-11-03 12:25
2004.11.21
Уничтожение компонента в Run Time.


14-1099263482
Yegorcic
2004-11-01 01:58
2004.11.21
Проблема с DVD-Rom ом


1-1099981951
Dima
2004-11-09 09:32
2004.11.21
Как динамически центрировать TLabel на форме.