Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2011.02.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2011.02.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.003 c
2-1291296114
privet123
2010-12-02 16:21
2011.02.27
Способ прочитать с диска - правильно так?


15-1290100289
Mitroshin
2010-11-18 20:11
2011.02.27
Несколько вопросов по переходу с D7 на D2010 (литература)


15-1289896344
Медвежонок Пятачок
2010-11-16 11:32
2011.02.27
нас ждут макрорегионы


2-1291286404
Анна
2010-12-02 13:40
2011.02.27
печать данных в Excel


15-1289204232
savva
2010-11-08 11:17
2011.02.27
[Работа] требуется Delphi разработчик (Москва)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский