-
Задался как-то вопросом "Как выводить полупрозрачные битмапы?"...
Посоветовали функцию "Windows.AlphaBlend;", начал потихоньку разбираться с ней, но получается выводить только на форму... :(
В Image1, например, не хочет нарисовываться... :(
Есть ли более нормальный способ, или это я как-то не так делаю?
-
> Посоветовали функцию "Windows.AlphaBlend
правильно посоветовали
> но получается выводить только на форму
вообще-то она в любой dc выводит, а не на форму. в том числе и в image.bitmap.canvas.handle
-
Я пробовал выводить по-всякому... В том числе и в "Image1.Picture.Bitmap.Canvas.Handle"...
Потому и спрашиваю, что ничего не выходит... :(
-
-
> глянь это: http://desksoft.ru/index.php?forum=13&th=187
Красиво. Но те, кто делает формы с position=poDesktopCenter подлежат принудительной эвтаназии, потому что растаскивать из центра двух мониторов - не самое интересное занятие :)
-
-
> Но те, кто делает формы с position=poDesktopCenter подлежат > принудительной эвтаназии, потому что растаскивать из центра > двух мониторов - не самое интересное занятие :)
у меня небыло еще двух мониторов :) а что ставить тогда? SystemParametersInfo() вернет так же область с объединенных мониторов? (в куче проектов для центра ее использовал :))
> AutoBOT (01.06.09 22:44) [5]
после прыганий вокруг AlphaBlend и не такое придумаешь :) тут просто попиксельное наложение, формулы блендинга общедоступны
-
antonn © (02.06.09 00:03) [6]
Я для splash-eй ставлю poScreenCenter, помогает.
-
Screen - не на середине экрана рисует сплеш? в смысле не в центре рабочей области
-
antonn © (02.06.09 00:58) [8]
Нет, он рисует посередине экрана на том мониторе, откуда запустили :) В смысле, по умолчанию, на PrimaryMonitor. А если передвинул на другой монитор, то по центру экрана другого монитора (D2006 по меньшей мере так себя ведет).
Кстати, у тебя случаем нету подобного примера с переходом одной картинки в другую (плавным переходом) ? :)
-
-
> такой пойдет? :)
Спасибо, конечно, но как-то резко, плавнее бы :) Наподобие того, как в setup-ах. Хочу splash сделать с переходом одной картинки в другую (ну с очень плавным постепенным переходом).
Блажь конечно, но забавно.
-
там просто выбирается каждый десятый кадр из 255 (в процедуре OnDraw_out()), пример просто для другого делался :) а так в RedrawPic() передается два битмапа (32 бита) и процентное соотношение блендинга (0-100)
-
собсно в thread_splash_scanline.pas процедура CopyBitmapAlfa32to32_gray() делает тоже самое, только учитывая еще альфаканал первого битмапа
-
-
AutoBOT (02.06.09 01:45) [14] > http://programmersforum.ru/showpost.php?p=272080&postcount=4
Procedure PicToPic(PicName1,PicName2,Times,Sleeper: String);
Var
bm, bm1, bm2: TBitMap;
p1, p2, p: PByteArray;
i, y, x: integer;
Begin
Sleep(StrToInt(Sleeper));
bm := TBitMap.Create;
bm1 := TBitMap.Create;
bm2 := TBitMap.Create;
bm1.LoadFromResourceName(HInstance,PicName1);
bm2.LoadFromResourceName(HInstance,PicName2);
bm.PixelFormat := pf24bit;
bm1.PixelFormat := pf24bit;
bm2.PixelFormat := pf24bit;
bm.Height :=bm1.Height;
bm.Width :=bm1.Width;
FRMIntr.IMGIntroSplash.Canvas.Draw(0, 0, bm1);
For i := 1 To StrToInt(Times) - 1 Do
Begin
For y := 0 To bm.Height - 1 Do
Begin
p := bm.ScanLine[y];
p1 := bm1.ScanLine[y];
p2 := bm2.ScanLine[y];
For x := 0 To bm.Width * 3 - 1 Do
p^[x] := round((p1^[x] * (StrToInt(times) - i) + p2^[x] * i) / StrToInt(times));
End;
FRMIntr.IMGIntroSplash.Canvas.Draw(0, 0, bm);
Application.ProcessMessages;
Sleep(5)
End;
bm1.Destroy;
bm2.Destroy;
bm.Destroy;
End; StrToInt(times) - это, надо понимать, чтобы не сильно быстро перетекало ? :)
-
> а так в RedrawPic() передается два битмапа (32 бита) и процентное > соотношение блендинга (0-100)
угу, спасибо, поглянем
-
после прыганий вокруг AlphaBlend и не такое придумаешь :)
Хм, а чем так страшна AlphaBlend? Я её толком не использовал, но по тестам - вроде работает, и не слишком медленно (сопоставимо с самописными методами). Хотя premulted alpha может ввести новичка в ступор, это да. И непоследовательно как-то со стороны MS - в одном месте избавить от ковыряния в пикселях, в другом - наоборот, заставить...
-
На некоторых системах она вообще не работала (на win2k, она не от GDI+ зависит?), пару раз присылали скриншоты, где по краям оставался какой то грязный ореол (вот тот яркорозовый фон который применяют обычно для transparent color с нанесенным изображением). А еще она позволит вывести с полупрозрачностью картинку с альфой? :) да еще с перерасчетом альфы конечного изображения (вот это меня заставило окончательно от нее отказаться).
-
а что мне действительно не понравилось, почему в GDI все 24х битное, т.е. я не могу нарисовать линию цветом с альфой (в четвертом байте), все равно на картинке рисуется линия, а альфа под ней просто затирается, в результате если выводить ее через updatelayeredwindow будет дырка (точнее на светлом фоне будет дырка, а на темном виден цвет на линии). Так же и с текстом, приходится изгаляться с масками всякими.
|