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

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

Помогите с выводом изображения


Страницы:   1 2

gray_falcon ©   (2007-05-28 16:21:00) 

Как мне вывести изображение из файла, и при том не одно, на форму 1024*768 с наименьшей нагрузкой на процессор.
Вся моя беда в том, что мне нужно нарисовать фон (делаю через BitBlt), а затем наложить изображение, убрав белый цыет (это через TransparentBlt).  Если вывожу сразу на форму, то изображение мерцает, если использую промежуточный HDC процессор конкретно загружается. А мне так на фон надо будет выводить несколько изображений. Помогите, кто чем может. Или мне пора справочники по DirectX находить?


  (2008-05-12 14:45:00) [1]

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


  (2008-01-16 19:02:00) [2]

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


Stexen   (2008-01-15 20:14:00) [3]


>  У меня лично остается незакрашеная область на форме.

А сабытия OnPaint для формы не помогут???Ну в обычном виде может и нет, но его переделать надо для своего класса формы и все будет в норме, чем по 25 раз выводить одно и тоже

> т-то собака и зарыта. Когда выводил прямо на форму все было
> нормально, а когда использовал промежуточный битмап, то
> формат его пикселей был иной (или его вообще не было?!)
> и на подгонку форматов уходили эти 40%. Вот так-то. Может
> это кому-нибудь еще пригодится.

По подробнее можно что это за подгонка???И как это формата пикселей небыло???блин что то я не догоняю ни про "подгонку" ни про форматы, это где про такие вещи написано???

> оп-ля, загрузка процессора: 0% ! Кто нибудь знает этому
> разумное объяснение и как это применить

Так то таймер в отдельном потоке выполняется


  (2008-01-11 10:33:00) [4]

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


  (2008-01-11 10:33:00) [5]

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


  (2008-01-10 18:23:00) [6]

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


MetalFan   (2007-12-26 19:46:00) [7]

переделай на GDI+, там есть CachedBitmap, которые умеют быстро выводиться.


  (2007-12-25 02:20:00) [8]

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


homm   (2007-05-31 21:00:00) [9]

Ну и выше конечно торже работает(Виста), я думаю это очевидно :).


homm   (2007-05-31 20:54:00) [10]

> Иногда лучше жевать ©

Ага, тебе.

Дальше кто читать будет?
Windows 95/98: TransparentBlt contains a memory leak that can exhaust system resources. To draw a transparent bitmap using BitBlt, see Knowledge Base article 79212.


Vovan #3   (2007-05-31 20:52:00) [11]

> Просто предупредить: функция TransparentBlt работает только в виндовс 2000/ХР.

Иногда лучше жевать (c)

TransparentBlt
Windows NT/2000/XP/Vista: Included in Windows 2000 and later.
Windows 95/98/Me: Included in Windows 98 and later.
Кстати, проверено.


homm   (2007-05-31 20:44:00) [12]

> Ну я так считаю, что тема закрыта.

Просто предупредить: функция TransparentBlt работает только в виндовс 2000/ХР.


gray_falcon   (2007-05-31 20:30:00) [13]


> Sapersky   (29.05.07 16:30) [6]
> Можно попробовать Bitmap.PixelFormat := pf32bit или Bitmap.
> PixelFormat := pfDevice (но всем битмапам один и тот же).
>

Огроменное спасибо!
Загрузка CPU 0%! Даже в голову не могло прийти изменить формат пикселей.
Обе картинки у меня 24 битные, поэтому достаточно

bmp.PixelFormat:=pf24bit;

и все в порядке. Но на всякий случай лучше у всех битмапов ставить одинаковый пиксельный формат после загрузки, если он заранее не известен.
Тут-то собака и зарыта. Когда выводил прямо на форму все было нормально, а когда использовал промежуточный битмап, то формат его пикселей был иной (или его вообще не было?!) и на подгонку форматов уходили эти 40%. Вот так-то. Может это кому-нибудь еще пригодится.
Еще раз огромнейшее спасибо!!! Дельный совет.
Ну я так считаю, что тема закрыта.


Vasiliy   (2007-05-31 15:41:00) [14]

Так что за задача?

Я например подобную вещь делаю под DirectShow с использованием VMR9, загрузка процессора 0%


gray_falcon   (2007-05-30 23:56:00) [15]


> А нахрена, скажи мне, выводить одну и ту же картинку 25
> раз в секунду без изменений?

Ну во-первых она там двигаться должна!!! Код не доделанный (движение сожрет еще ресурсов). А 25 Гц применяется часто в фильмах. Меньшая тянет на фиговенькую анимацию
А во-вторых, я вывожу прямо на Canvas формы, попробуй-ка открыть Диспетчер (Ctr-Alt-Del), или передать фокус другому окну, а потом вернуть своему. У меня лично остается незакрашеная область на форме.


DVM   (2007-05-29 17:44:00) [16]


> gray_falcon ©  

А нахрена, скажи мне, выводить одну и ту же картинку 25 раз в секунду без изменений?


Sapersky   (2007-05-29 16:30:00) [17]

Можно попробовать Bitmap.PixelFormat := pf32bit или Bitmap.PixelFormat := pfDevice (но всем битмапам один и тот же).


homm   (2007-05-29 16:22:00) [18]

Ровно 10 тактов получаеться в секунду! :))


homm   (2007-05-29 16:21:00) [19]

> поэтому при частоте 25 Гц проц на 40% грузится.

Я плакал :))


gray_falcon   (2007-05-29 15:32:00) [20]


> DVM ©
> показывай как выводишь


вот так


var
Form1: TForm1;
img, fon, bmp: TBitmap;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
img:=TBitmap.Create;
fon:=TBitmap.Create;
bmp:=TBitmap.Create;

img.LoadFromFile(ExtractFilePath(Application.ExeName)+'img.bmp');
fon.LoadFromFile(ExtractFilePath(Application.ExeName)+'fon.bmp');

bmp.Width:=1024;
bmp.Height:=768;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 BitBlt(bmp.Canvas.Handle,0,0,fon.Width,fon.Height,fon.Canvas.Handle,0,0,SRCCopy) ;
 TransparentBlt(bmp.Canvas.Handle,0,25,img.Width,img.Height,img.Canvas.Handle,0,0 ,img.Width,img.Height,clWhite);
 BitBlt(Canvas.Handle,0,0,1024,768,bmp.Canvas.Handle,0,0,SRCCopy);
end;


ко всему прочему у меня это самое 'img.bmp' 1027*750 и прозрачность его очень долго обрабатывается, поэтому при частоте 25 Гц проц на 40% грузится.
Ну размер я сменю если надо, а вот если если в Timer1Timer написать


procedure TForm1.Timer1Timer(Sender: TObject);
begin
 BitBlt(Canvas.Handle,0,0,fon.Width,fon.Height,fon.Canvas.Handle,0,0,SRCCopy);
 TransparentBlt(Canvas.Handle,0,25,img.Width,img.Height,img.Canvas.Handle,0,0,img .Width,img.Height,clWhite);
end;


то оп-ля, загрузка процессора: 0% ! Кто нибудь знает этому разумное объяснение и как это применить, что-бы не мерцало.
И еще кто знает, почему bitmap формата 1024*768 при загрузке выдает 'stream read error'?


Страницы:   1 2

Наверх

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