Главная страница
    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.037 c
4-1097143732
mtihonov
2004-10-07 14:08
2004.11.21
Переключение окон


14-1099428143
TDK
2004-11-02 23:42
2004.11.21
Загрузка и синий экран "смерти"


3-1098430766
Aser
2004-10-22 11:39
2004.11.21
Как выбрать все из таблицы 1 и все из таблицы 2


1-1099899089
Андерсон
2004-11-08 10:31
2004.11.21
WinHelp - как вывести главное окно


1-1099568054
TUser
2004-11-04 14:34
2004.11.21
sharing violation





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