Delphi Image доступ к битам

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 9 Oct 2012.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    В общем что-то отупел с годами толи гуглом разучился пользоваться. В общем что надо:
    1) Есть TImage фиксированного размера
    2) Есть массив с данными (данные какраз описываются каждый пиксель картинки т.е. их размер = sizeof(пиксель) * w * h)

    Необходимо прорисовать эти пиксели.
    Сразу скажу что не подходят методы основанные на
    1) на ScanLine потому что нужно не тока читать но и писать
    2) Не подходит работа с пикселями черезе SetPixel/GetPixel/Pixel и им подобные по причине медленной скорости

    В общем требуется получить прямой доступ к буфера картинки. Логика подсказывает что надо мутить всё через DIB секции. Но хочется както средствами самой делфи это делать. Или же может есть компонент аналог timage который даёт доступ к памяти
     
    #1 slesh, 9 Oct 2012
    Last edited: 9 Oct 2012
  2. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    а массив обновляется?
    пробовал directdraw, bitblt?еще попробуй либу QuickPixels

    upd погугли работу с ф-ей SetDIBitsToDevice
    сам не пользовался,но говорят быстро все делается,только надо понять как сделать что б в кач-ве параметра массив принялся.
     
    #2 DooD, 9 Oct 2012
    Last edited: 9 Oct 2012
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Спасиб. В общем-то нашел еще довольно простой способ.
    1) Ручками заполнить tagBITMAPINFO
    2) Далее Image1.Picture.Bitmap.Handle := CreateDIBSection
    3) Далее писать в полученную память и далее делать Repaint
     
  4. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    С каких пор писать нельзя?

    Вроде как так делать нельзя, как минимум после того как была вызвана процедуры HandleNeeded в TBitmap.

    FastDIB вроде называется.
     
    #4 Jingo Bo, 9 Oct 2012
    Last edited: 9 Oct 2012
  5. $asha

    $asha New Member

    Joined:
    6 Jul 2011
    Messages:
    14
    Likes Received:
    4
    Reputations:
    0
    Я бы делал через ScanLine, ибо писать через него тоже можно