Главная страница
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.028 c
1-1099408347
Agent[007]
2004-11-02 18:12
2004.11.21
Всем hi. Как задать property у класса и можно ли его задать у r


1-1099685715
Piter
2004-11-05 23:15
2004.11.21
а какой тип вызова у .NET библиотек?


8-1092503031
Batoon
2004-08-14 21:03
2004.11.21
Помогите определиться


14-1099171977
Yegorchic
2004-10-31 01:32
2004.11.21
Генератор алгоритма


1-1099601114
Garfunkel
2004-11-04 23:45
2004.11.21
Вставка текста с форматированием