Главная страница
    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.46 MB
Время: 0.038 c
14-1099645652
КаПиБаРа
2004-11-05 12:07
2004.11.21
Net Send


6-1095185263
-MS-
2004-09-14 22:07
2004.11.21
Delphi+CGI+ServerSocket


14-1099916302
Piter
2004-11-08 15:18
2004.11.21
Устройство TApplication


1-1099862330
Metrolog
2004-11-08 00:18
2004.11.21
Распознавание выражений


3-1098518072
TALLA
2004-10-23 11:54
2004.11.21
связь с MySQL: почему ZeosLib работает, а через механизм ADO -нет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский