![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с выводом изображения
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'?