Конференция "Media" » Как выводить полупрозрачные битмапы? [D7, WinXP]
 
  • AutoBOT (31.05.09 03:26) [0]
    Задался как-то вопросом "Как выводить полупрозрачные битмапы?"...

    Посоветовали функцию "Windows.AlphaBlend;", начал потихоньку разбираться с ней, но получается выводить только на форму... :(

    В Image1, например, не хочет нарисовываться... :(

    Есть ли более нормальный способ, или это я как-то не так делаю?
  • Игорь Шевченко © (31.05.09 15:55) [1]

    > Посоветовали функцию "Windows.AlphaBlend


    правильно посоветовали


    > но получается выводить только на форму


    вообще-то она в любой dc выводит, а не на форму. в том числе и в image.bitmap.canvas.handle
  • AutoBOT (31.05.09 22:25) [2]
    Я пробовал выводить по-всякому...
    В том числе и в "Image1.Picture.Bitmap.Canvas.Handle"...

    Потому и спрашиваю, что ничего не выходит... :(
  • antonn © (01.06.09 14:19) [3]

    > правильно посоветовали

    не стоит.


    > AutoBOT   (31.05.09 03:26)

    глянь это: http://desksoft.ru/index.php?forum=13&th=187
  • Игорь Шевченко © (01.06.09 22:10) [4]

    > глянь это: http://desksoft.ru/index.php?forum=13&th=187


    Красиво. Но те, кто делает формы с position=poDesktopCenter подлежат принудительной эвтаназии, потому что растаскивать из центра двух мониторов - не самое интересное занятие :)
  • AutoBOT (01.06.09 22:44) [5]
    > глянь это: http://desksoft.ru/index.php?forum=13&th=187

    Здорово... Неужели Вы это всё сами придумали?))

    По каким книгам можно выучить такие приёмы?

    А с Windows.AlphaBlend; значит уже ничего нельзя поделать? :(
  • antonn © (02.06.09 00:03) [6]

    > Но те, кто делает формы с position=poDesktopCenter подлежат
    > принудительной эвтаназии, потому что растаскивать из центра
    > двух мониторов - не самое интересное занятие :)

    у меня небыло еще двух мониторов :)
    а что ставить тогда? SystemParametersInfo() вернет так же область с объединенных мониторов? (в куче проектов для центра ее использовал :))


    > AutoBOT   (01.06.09 22:44) [5]

    после прыганий вокруг AlphaBlend и не такое придумаешь :)
    тут просто попиксельное наложение, формулы блендинга общедоступны
  • Игорь Шевченко © (02.06.09 00:12) [7]
    antonn ©   (02.06.09 00:03) [6]

    Я для splash-eй ставлю poScreenCenter, помогает.
  • antonn © (02.06.09 00:58) [8]
    Screen - не на середине экрана рисует сплеш? в смысле не в центре рабочей области
  • Игорь Шевченко © (02.06.09 01:06) [9]
    antonn ©   (02.06.09 00:58) [8]

    Нет, он рисует посередине экрана на том мониторе, откуда запустили :) В смысле, по умолчанию, на PrimaryMonitor. А если передвинул на другой монитор, то по центру экрана другого монитора (D2006 по меньшей мере так себя ведет).

    Кстати, у тебя случаем нету подобного примера с переходом одной картинки в другую (плавным переходом) ? :)
  • antonn © (02.06.09 01:13) [10]
  • Игорь Шевченко © (02.06.09 01:33) [11]

    > такой пойдет? :)


    Спасибо, конечно, но как-то резко, плавнее бы :)
    Наподобие того, как в setup-ах.
    Хочу splash сделать с переходом одной картинки в другую (ну с очень плавным постепенным переходом).

    Блажь конечно, но забавно.
  • antonn © (02.06.09 01:38) [12]
    там просто выбирается каждый десятый кадр из 255 (в процедуре OnDraw_out()), пример просто для другого делался :)
    а так в RedrawPic() передается два битмапа (32 бита) и процентное соотношение блендинга (0-100)
  • antonn © (02.06.09 01:40) [13]
    собсно в thread_splash_scanline.pas процедура CopyBitmapAlfa32to32_gray() делает тоже самое, только учитывая еще альфаканал первого битмапа
  • AutoBOT (02.06.09 01:45) [14]
    Есть процедура перетекания одного изображения в другое:

    http://programmersforum.ru/showpost.php?p=272080&postcount=4
  • Игорь Шевченко © (02.06.09 01:54) [15]
    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) - это, надо понимать, чтобы не сильно быстро перетекало ? :)
  • Игорь Шевченко © (02.06.09 01:55) [16]

    > а так в RedrawPic() передается два битмапа (32 бита) и процентное
    > соотношение блендинга (0-100)


    угу, спасибо, поглянем
  • Sapersky (02.06.09 11:46) [17]
    после прыганий вокруг AlphaBlend и не такое придумаешь :)

    Хм, а чем так страшна AlphaBlend?
    Я её толком не использовал, но по тестам - вроде работает, и не слишком медленно (сопоставимо с самописными методами).
    Хотя premulted alpha может ввести новичка в ступор, это да. И непоследовательно как-то со стороны MS - в одном месте избавить от ковыряния в пикселях, в другом - наоборот, заставить...
  • antonn © (02.06.09 12:46) [18]
    На некоторых системах она вообще не работала (на win2k, она не от GDI+ зависит?), пару раз присылали скриншоты, где по краям оставался какой то грязный ореол (вот тот яркорозовый фон который применяют обычно для transparent color с нанесенным изображением).
    А еще она позволит вывести с полупрозрачностью картинку с альфой? :)
    да еще с перерасчетом альфы конечного изображения (вот это меня заставило окончательно от нее отказаться).
  • antonn © (02.06.09 12:50) [19]
    а что мне действительно не понравилось, почему в GDI все 24х битное, т.е. я не могу нарисовать линию цветом с альфой (в четвертом байте), все равно на картинке рисуется линия, а альфа под ней просто затирается, в результате если выводить ее через updatelayeredwindow будет дырка (точнее на светлом фоне будет дырка, а на темном виден цвет на линии). Так же и с текстом, приходится изгаляться с масками всякими.
 
Конференция "Media" » Как выводить полупрозрачные битмапы? [D7, WinXP]
Есть новые Нет новых   [134430   +2][b:0][p:0.002]