Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TCanvas [WinXP]


Страницы:   1 2

Nigthmare ©   (2007-10-30 19:22:00) 

Привет всем !!!
Я обнаружил глюк в Delphi, короче, если через канву на 32-х битном битмапе
рисовать другой 32-х битный битмап, то вместо того чтобы по получившемуся альфа каналу выщитывать
цвет пикселей, процесс зарисовки сводится к простому заменению пикселей одного битмапа пикселями другого
битмапа.  

Кто знает как избежать этотого глюка?


@!!ex   (2007-11-17 23:05:00) [1]

> А что там может быть еще? Например? (я с тобой не спорю,
> мне просто для интереса)

Вообще изначально ALpha канал не подразумевался как прозрачность.
Это был просто дополнительный информационный канал о цвете точки, я не помню уже точно для чего он был придуман, могу поискать материал, если надо.
Просто так сложилось что в большинстве случаев там хранится именно альфа.(мы, например, храним там LightMap, а в RGB - Specular).


ку?   (2007-11-17 14:28:00) [2]

Удалено модератором


hommro   (2007-11-17 14:05:00) [3]

Удалено модератором
Примечание: По твоей просьбе оглашаю, за нарушение режима RO продлен до 3 дней


Nightmare   (2007-11-17 13:56:00) [4]

Спасибо


Anatoly Podgoretsky   (2007-11-17 13:49:00) [5]


> может есть какой нибудь справочник по всем этим функциям?

Есть MS SDK и он уже на твоем компьютере и есть его старший брат MSDN доступен и бесплатно через Сеть, на сайте Microsoft, вроде msdn2.microsoft.com


homm   (2007-11-17 11:09:00) [6]

> [15] Nightmare   (17.11.07 11:04)
> а можно по русски

я ее прямо в окне оправки сообщения написал.


Nightmare   (2007-11-17 11:04:00) [7]

а можно по русски


homm   (2007-11-17 10:52:00) [8]

> [13] Nightmare   (17.11.07 09:59)
> я её в первый раз вижу

я тоже. Предствляешь, я ее прямо в окен оправки сообщения написал ;)


Nightmare   (2007-11-17 09:59:00) [9]

Например ту же функцию Zero memory(я её в первый раз вижу).

может есть какой нибудь справочник по всем этим функциям?


homm   (2007-11-17 09:34:00) [10]

> [11] Nightmare   (17.11.07 08:45)
> Где вы всё это берёте?

Что это?


Nightmare   (2007-11-17 08:45:00) [11]

Да........... Учится мне ещё и учиться.

P.S. Где вы всё это берёте?


homm   (2007-11-16 22:02:00) [12]

хотя-бы так…

procedure EraseBitmap(SourceBitmap: TBitmap);
var
  i, j: Integer;
  Delta: DWORD;
  W, H: Integer;
begin
  W := SourceBitmap.Width;
  H := SourceBitmap.Height;
  SL := SourceBitmap.ScanLine[0];
  Delta := DWORD(SourceBitmap.ScanLine[1]) - DWORD(SourceBitmap.ScanLine[0]);
  for i := 0 to H-1 do begin
    ZeroMemory(SL, W*4);
    SL := Pointer(DWORD(SL) + Delta);
  end;
end;


homm   (2007-11-16 21:57:00) [13]

Удалено модератором


Nightmare   (2007-11-16 21:51:00) [14]

Вообще я использовал функция Alphablend просто и со вкусом, правда
если надо чтобы та канва на которую рисуется изображение была 32 бита надо перед этим её очистить(мне это надо было для Update Layred window)

процедурка очистки ниже:

procedure FreeBitmap(SourceBitmap: TBitmap);
type
 ARGBQuad = array [0..0] of TRGBQuad;
 PARGBQuad = ^ARGBQuad;
 AByte = array [0..0] of Byte;
 PAByte = ^AByte;
var
 SL: PARGBQuad;
 R: ^TRGBQuad;
 i, j: Integer;
 Delta: DWORD;
 W, H: Integer;
begin
 W := SourceBitmap.Width;
 H := SourceBitmap.Height;
 SL := SourceBitmap.ScanLine[0];
 Delta := DWORD(SourceBitmap.ScanLine[1]) - DWORD(SourceBitmap.ScanLine[0]);
    for i := 0 to H-1 do begin
     for j := 0 to W-1 do begin
         R := @SL[j];
         R.rgbBlue := 0;
         R.rgbGreen := 0;
         R.rgbRed := 0;
         R.rgbReserved := 0;
     end;
     SL := Pointer(DWORD(SL) + Delta);
   end;
end;


Ins   (2007-11-06 22:45:00) [15]

Nigthmare

Гляньте здесь:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=46659


homm   (2007-10-31 17:47:00) [16]

> [5] Ricks ©   (31.10.07 17:38)
> А что там может быть еще?

Может ничего не быть. Может быть стнсил буфер (как он там называется). Все что угодно может быть, на то он и резервный.


Ricks   (2007-10-31 17:38:00) [17]


> Нигде не написано, что разарвный байт 32-х битного цвета
> — это альфаканал, соответственно никто его как альфу обрабатывать
> не должен.

А что там может быть еще? Например? (я с тобой не спорю, мне просто для интереса)


homm   (2007-10-30 21:55:00) [18]

> [0] Nigthmare   (30.10.07 19:22)
> Кто знает как избежать этотого глюка?

Глюк в твей днк. Нигде не написано, что разарвный байт 32-х битного цвета — это альфаканал, соответственно никто его как альфу обрабатывать не должен.


Nigthmare   (2007-10-30 21:51:00) [19]

Мда, как всё мудно... но всёравно спасибо за ответы.


Sapersky   (2007-10-30 20:11:00) [20]

Это не глюк. TCanvas - обёртка на GDI, а в GDI альфа-блендинга нет.
Точнее, есть функция AlphaBlend, но в Win98 она работает нестабильно или вообще не работает; видимо, из желания сохранить совместимость с Win9x борландовцы не стали её использовать.
По использованию AlphaBlend:
http://rsdn.ru/archive/vc/issues/pvc045.htm
Или см. сюда:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1192964708&n=7


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо