Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.049 c
1-1099224487
lipskiy
2004-10-31 15:08
2004.11.21
Печать из браузера по умолчанию?


1-1099260966
Кто---то
2004-11-01 01:16
2004.11.21
Как преобразовать картинку в шрифт ?


14-1099482873
VEG
2004-11-03 14:54
2004.11.21
Ограничение на количество окон в Windows


14-1099564515
Ozone
2004-11-04 13:35
2004.11.21
Учимся писать документацию


3-1098806092
GigoVich
2004-10-26 19:54
2004.11.21
TDBGrid + TQuery + FireBird (embeded)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский