Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.02.27;
Скачать: CL | DM;

Вниз

Помогите с выводом изображения   Найти похожие ветки 

 
gray_falcon ©   (2007-05-28 16:21) [0]

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


 
antonn ©   (2007-05-28 18:27) [1]

создать TBitmap, рисовать на нем, его выводить через BitBlt


 
DVM ©   (2007-05-29 11:27) [2]


> gray_falcon ©  

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


 
gray_falcon ©   (2007-05-29 15:32) [3]


> 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"?


 
homm ©   (2007-05-29 16:21) [4]

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

Я плакал :))


 
homm ©   (2007-05-29 16:22) [5]

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


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

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


 
DVM ©   (2007-05-29 17:44) [7]


> gray_falcon ©  

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


 
gray_falcon ©   (2007-05-30 23:56) [8]


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

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


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

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

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


 
gray_falcon ©   (2007-05-31 20:30) [10]


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

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

bmp.PixelFormat:=pf24bit;

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


 
homm ©   (2007-05-31 20:44) [11]

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

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


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

>Просто предупредить: функция 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:54) [13]

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

Ага, тебе.

Дальше кто читать будет?
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.


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

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


 
имя   (2007-12-25 02:20) [15]

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


 
MetalFan ©   (2007-12-26 19:46) [16]

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


 
имя   (2008-01-10 18:23) [17]

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


 
имя   (2008-01-11 10:33) [18]

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


 
имя   (2008-01-11 10:33) [19]

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


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


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

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

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

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

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

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


 
имя   (2008-01-16 19:02) [21]

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


 
имя   (2008-05-12 14:45) [22]

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



Страницы: 1 вся ветка

Текущий архив: 2011.02.27;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.01 c
2-1291815359
Scott Storch
2010-12-08 16:35
2011.02.27
try..finally


2-1291585874
Ghost del vonte
2010-12-06 00:51
2011.02.27
Проверка слов


15-1290150470
И. Павел
2010-11-19 10:07
2011.02.27
Установка программ в "Application Data"


2-1290929948
SIV5000
2010-11-28 10:39
2011.02.27
IShellFolder и диалог свойства файлов


15-1289897307
vajo
2010-11-16 11:48
2011.02.27
Контроль печати принтера