Конференция "Media" » Помогите с выводом изображения
 
  • gray_falcon © (28.05.07 16:21) [0]
    Как мне вывести изображение из файла, и при том не одно, на форму 1024*768 с наименьшей нагрузкой на процессор.
    Вся моя беда в том, что мне нужно нарисовать фон (делаю через BitBlt), а затем наложить изображение, убрав белый цыет (это через TransparentBlt).  Если вывожу сразу на форму, то изображение мерцает, если использую промежуточный HDC процессор конкретно загружается. А мне так на фон надо будет выводить несколько изображений. Помогите, кто чем может. Или мне пора справочники по DirectX находить?
  • antonn © (28.05.07 18:27) [1]
    создать TBitmap, рисовать на нем, его выводить через BitBlt
  • DVM © (29.05.07 11:27) [2]

    > gray_falcon ©  

    показывай как выводишь
  • gray_falcon © (29.05.07 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 © (29.05.07 16:21) [4]
    > поэтому при частоте 25 Гц проц на 40% грузится.

    Я плакал :))
  • homm © (29.05.07 16:22) [5]
    Ровно 10 тактов получаеться в секунду! :))
  • Sapersky (29.05.07 16:30) [6]
    Можно попробовать Bitmap.PixelFormat := pf32bit или Bitmap.PixelFormat := pfDevice (но всем битмапам один и тот же).
  • DVM © (29.05.07 17:44) [7]

    > gray_falcon ©  

    А нахрена, скажи мне, выводить одну и ту же картинку 25 раз в секунду без изменений?
  • gray_falcon © (30.05.07 23:56) [8]

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

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

    Я например подобную вещь делаю под DirectShow с использованием VMR9, загрузка процессора 0%
  • gray_falcon © (31.05.07 20:30) [10]

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

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

    bmp.PixelFormat:=pf24bit;


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

    Просто предупредить: функция TransparentBlt работает только в виндовс 2000/ХР.
  • Vovan #3 (31.05.07 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 © (31.05.07 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 © (31.05.07 21:00) [14]
    Ну и выше конечно торже работает(Виста), я думаю это очевидно :).
  • имя (25.12.07 02:20) [15]
    Удалено модератором
  • MetalFan © (26.12.07 19:46) [16]
    переделай на GDI+, там есть CachedBitmap, которые умеют быстро выводиться.
  • имя (10.01.08 18:23) [17]
    Удалено модератором
  • имя (11.01.08 10:33) [18]
    Удалено модератором
  • имя (11.01.08 10:33) [19]
    Удалено модератором
 
Конференция "Media" » Помогите с выводом изображения
Есть новые Нет новых   [134431   +15][b:0][p:0.002]