-
Как мне вывести изображение из файла, и при том не одно, на форму 1024*768 с наименьшей нагрузкой на процессор. Вся моя беда в том, что мне нужно нарисовать фон (делаю через BitBlt), а затем наложить изображение, убрав белый цыет (это через TransparentBlt). Если вывожу сразу на форму, то изображение мерцает, если использую промежуточный HDC процессор конкретно загружается. А мне так на фон надо будет выводить несколько изображений. Помогите, кто чем может. Или мне пора справочники по DirectX находить?
-
создать TBitmap, рисовать на нем, его выводить через BitBlt
-
> gray_falcon ©
показывай как выводишь
-
> DVM © > показывай как выводишь
вот так
var
Form1: TForm1;
img, fon, bmp: TBitmap;
implementation
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'?
-
> поэтому при частоте 25 Гц проц на 40% грузится.
Я плакал :))
-
Ровно 10 тактов получаеться в секунду! :))
-
Можно попробовать Bitmap.PixelFormat := pf32bit или Bitmap.PixelFormat := pfDevice (но всем битмапам один и тот же).
-
> gray_falcon ©
А нахрена, скажи мне, выводить одну и ту же картинку 25 раз в секунду без изменений?
-
> А нахрена, скажи мне, выводить одну и ту же картинку 25 > раз в секунду без изменений?
Ну во-первых она там двигаться должна!!! Код не доделанный (движение сожрет еще ресурсов). А 25 Гц применяется часто в фильмах. Меньшая тянет на фиговенькую анимацию А во-вторых, я вывожу прямо на Canvas формы, попробуй-ка открыть Диспетчер (Ctr-Alt-Del), или передать фокус другому окну, а потом вернуть своему. У меня лично остается незакрашеная область на форме.
-
Так что за задача?
Я например подобную вещь делаю под DirectShow с использованием VMR9, загрузка процессора 0%
-
> Sapersky (29.05.07 16:30) [6] > Можно попробовать Bitmap.PixelFormat := pf32bit или Bitmap. > PixelFormat := pfDevice (но всем битмапам один и тот же). >
Огроменное спасибо! Загрузка CPU 0%! Даже в голову не могло прийти изменить формат пикселей. Обе картинки у меня 24 битные, поэтому достаточно
bmp.PixelFormat:=pf24bit;
и все в порядке. Но на всякий случай лучше у всех битмапов ставить одинаковый пиксельный формат после загрузки, если он заранее не известен. Тут-то собака и зарыта. Когда выводил прямо на форму все было нормально, а когда использовал промежуточный битмап, то формат его пикселей был иной (или его вообще не было?!) и на подгонку форматов уходили эти 40%. Вот так-то. Может это кому-нибудь еще пригодится. Еще раз огромнейшее спасибо!!! Дельный совет. Ну я так считаю, что тема закрыта.
-
> Ну я так считаю, что тема закрыта.
Просто предупредить: функция TransparentBlt работает только в виндовс 2000/ХР.
-
>Просто предупредить: функция 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. Кстати, проверено.
-
> Иногда лучше жевать ©
Ага, тебе. Дальше кто читать будет? 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.
-
Ну и выше конечно торже работает(Виста), я думаю это очевидно :).
-
Удалено модератором
-
переделай на GDI+, там есть CachedBitmap, которые умеют быстро выводиться.
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
> У меня лично остается незакрашеная область на форме.
А сабытия OnPaint для формы не помогут???Ну в обычном виде может и нет, но его переделать надо для своего класса формы и все будет в норме, чем по 25 раз выводить одно и тоже
> т-то собака и зарыта. Когда выводил прямо на форму все было > нормально, а когда использовал промежуточный битмап, то > формат его пикселей был иной (или его вообще не было?!) > и на подгонку форматов уходили эти 40%. Вот так-то. Может > это кому-нибудь еще пригодится.
По подробнее можно что это за подгонка???И как это формата пикселей небыло???блин что то я не догоняю ни про "подгонку" ни про форматы, это где про такие вещи написано???
> оп-ля, загрузка процессора: 0% ! Кто нибудь знает этому > разумное объяснение и как это применить
Так то таймер в отдельном потоке выполняется
-
Удалено модератором
-
Удалено модератором
|