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

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

KolPng [Delphi, Windows]


Redline ©   (2006-09-29 18:48:00) 

Здравствуйте. Использую TPngObject. Открываю через него файл и рисую на PaintBox. Но не знаю как сделать его прозрачным!


alex3   (2006-10-03 21:56:00) [1]

PNG формат- портативная сетевая графика, был разработан для сетевого применения, основная фича состоит в методе появления изображения на
странице, при загрузке изображения. Его преимущество состоит в том, что
вы можете увидеть содержание картинки, в грубом виде, еще до полной загрузки. Вот по этому он состоит из так называемых кусков. Если кому интересно, можете прочитать в хелпе на сайте разработчиков PNG.  
Я применял масштабирование PNG для небольшой анимации.
Вообще был бы интересен графический формат с анимацией и альфа каналом! Аля GIF & PNG.


Sapersky   (2006-10-03 13:57:00) [2]

т.е. только если вам самим это зачем-то нужно, и вы объявили REDEFINE_ABS.

О, пардон. Использую старую версию KOL, когда новую смотрел - REDEFINE_ABS не заметил.

2)Для возможности манипуляций с альфа-каналом, к примеру, изменять
прозрачность отдельных  участков. Возможно так же массштабирование.


Но обычно требуется только альфа-блендинг, большинство реализаций которого подразумевают что альфа-канал находится там же, где и r,g,b.

Ну ладно, я понял - "вам это надо, вы и переделывайте" :)


Vladimir Kladov   (2006-10-02 21:53:00) [3]

{$IFDEF REDEFINE_ABS}
  function Abs( X: Integer ): Integer;
  {* absolute value }
{$ENDIF}


т.е. только если вам самим это зачем-то нужно, и вы объявили REDEFINE_ABS.

Медленно? Сделайте быстрее, положите свой вариант. Еще есть Gdi+, KOLGraphics.


alex3   (2006-10-02 20:14:00) [4]

>1) Зачем грузить альфа-канал в какую-то отдельную область памяти
1)Так устроен формат Png.
2)Для возможности манипуляций с альфа-каналом, к примеру, изменять
прозрачность отдельных  участков. Возможно так же массштабирование.


Sapersky   (2006-10-02 19:51:00) [5]

> сделай проще. как в Директ3Д или ДиректДрав.
Разьве так будет проще?


Это в том смысле, что выполнять блендинг лучше не на уровне окон/компонентов, а  вручную, битмап1 + битмап2, и потом выводить результат обычным BitBlt/Draw.
Сам по себе алгоритм несложен, есть множество реализаций, правда, для KOL.TBitmap я не видел ни одной. Для VCL.TBitmap должна быть здесь:
http://kladovka.net.ru/download.cgi?id=252
Также есть в составе SpriteUtils:
http://www.miek.narod.ru/spriteutils2.zip

Но вообще самое простое и быстрое - заранее наложить эти две картинки друг на друга в фотошопе :)

Кстати, хочу тоже пожаловаться на KOLPng:
1) Зачем грузить альфа-канал в какую-то отдельную область памяти, если он прекрасно умещается в 4-й байт 32-битного цвета.
2) Загрузка из файла (декодирование) - медленно! IrfanView грузит png раза в 2 быстрее. Основной (хотя, возможно, и не единственный) тормоз - т.н. фильтры, особенно PAETH. Попробовал оптимизировать - выжал процентов 15. Всё равно медленно...
В процессе расковыривания кода фильтров выяснилось, что в KOL.pas зачем-то реализована функция Abs. Допустим, что это очень качественная сверхоптимизированная реализация - но стандартная Abs инлайнится и потому заведомо быстрее.


[e]Bu$ter   (2006-10-02 12:46:00) [6]


> сделай проще. как в Директ3Д или ДиректДрав.

Разьве так будет проще? Я не сталкивался до этого ни с Директ3Д ни с ДиректДрав. Думаешь пора?


> где у тебя перерисовка?
> в onPaint? если нет, тогда не очень хорошо.

Отрисовка идёт именно в onPaint. Вот так:

procedure TefsForm.KOLForm1Paint(Sender: PControl; DC: HDC);
begin
 kolpng.DrawTransparent(DC, 0, 0, kolpng.TransparentColor);
end;



> такая фигня начинается когда в onPaint нету заливки заднего фона

Вот! Может в этом проблема? Как организвать заливку заднего фона?

P.S. В разрабатываемой программе очень критична скорость запуска. И хоть я не знаю пока как там работает Direct(Draw\3D), но мне кажется инициалзиация всего этого будет идти дольше чем при использовании KolPng. М?


Barloggg   (2006-10-02 12:31:00) [7]

ты.

сделай проще. как в Директ3Д или ДиректДрав.

а именно, заведи итоговую картинку.
и уже ее быстро отрисовывай на всю форму при каждой перерисовке формы.

второе.
где у тебя перерисовка?
в onPaint? если нет, тогда не очень хорошо.

такая фигня начинается когда в onPaint нету заливки заднего фона да и отрисовки вообще.


[e]Bu$ter   (2006-10-02 11:37:00) [8]


> Может быть это:
> http://www.delphimaster.ru/cgi-bin/forum.pl?id=1158934714&n=10

Кажется это не то. Вопрос в другом.
В моём случае, совершенно не обязательно делать окно под размер и форму изображения (тем более, что возможна ситауция, когда края изображения ярко не выражены и форма всё-равно будет больше "нормально" видимой части картинки).

Тут, всего-лишь нужно побороть один глюк: кривую перерисовку формы при её движении по экрану или при движении контролов по ней.

Вот два скрина:
После того как появилась форма: http://ebuster.fatal.ru/form_befor_drag.jpg
После того как её подвигали по экрану: http://ebuster.fatal.ru/form_after_drag.jpg
На втором, видно то безобразие которое хочется побороть.

Как я рисую, уже описано выше. Напомню лишь, что если transperent у формы вылкючить (сделать false) то прозрачность у изображения рисуется нормально.

Вот я и думаю, кто виноват в проиллюстрированном глюке: форма (KOL), KolPng, или я?


ANTPro   (2006-10-01 15:24:00) [9]

[e]Bu$ter ©   (01.10.06 12:10) [5]
Может быть это:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1158934714&n=10


[e]Bu$ter   (2006-10-01 12:10:00) [10]

Извините, что немного не в тему, но вопрос кажется похожий.

Если через DC рисовать на форме с помощью DrawTransparent полупрозрачной картинкой (по краям, она как бы растворяется) при transperent:true у формы, всё смазывается, а при выключеном - прозрачность рисуется нормально, но естествено видно форму.
Т.е. как только появляется окно и происходит первая перерисовка, то всё вроде бы нормально, но когда начинаешь двигать форму по экрану - всё смазывается.

Может кто-то видел? Подскажите пожалуйста где копать?


Redline   (2006-09-29 19:43:00) [11]

Просто переделываю прогу из vcl. Там я сделал так: взял 2 timage, наложил друг на друга, загрузил png файлы, и все получилось красиво. Попытался  сделать также в kol, из под одного объекта другого не видно. Вот и ищу решение.


Vladimir Kladov   (2006-09-29 19:30:00) [12]

А при чем тут png. Вам тогда надо или SetLayer... или отдельную форму с Alpha задействовать.


Redline   (2006-09-29 19:25:00) [13]

Это не то. Мне нужна полупрозрачность, так чтобы и картинку было видно и то что за ней. А за ней находится другой paintbox.


Vladimir Kladov   (2006-09-29 19:11:00) [14]

У него же есть DrawTransparent. Или вы в исходник не заглядывали?


Наверх

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