GD Star Rating
loading...

Друганы, подскажите как сделать такой вот сдвиг изображения (Bitmap допустим) на C#. Желательно поэффективнее.

image

19 Responses to сдвиг изображения (Bitmap допустим) на C#

  1. LanTunes:

    Вывести битмап с отрицательной координатой X?

  2. Adoapp:

    : Не не. Битмап сам не трогаем. Только его содержимое – пиксели. Получается как-бы скопировать часть пикселей левее. Ну типа как рисуешь осциллограмму, новые данные рисуются, а старые теряются.

  3. Suebad:

    Вот про эту функцию почитай. Она позволяет копировать куски битмапины с контекста на контекст. Не C#, конечно, но через C# можно вызывать Windows-функции и вытаскивать контекст. Работает шустрее, чем класс Graphics в.NET

  4. LanTunes:

    : я думаю, что система выведет тебе битмап внутрь контекста (не обзятально на экран) гораздо быстрее, чем ты будешь заморачиваться с переносом байтиков туда-сюда, возможно что это будет сделано даже аппаратно. Вон ниже BitBlt предложили, например, допустим – смысл тот же, берешь контекст, выводишь в него битмап в минуса, дорисовываешь сего тебе надобно и выводишь на девайс.

  5. Adoapp:

    : Это не подходит, так как мне надо сохранять все изменения в битмапе. Опишу подробнее.

    Имеются поступающие данные. Необходимо визуализировать последние N-элементов данных. Есть очередь, где хранятся эти N элементов. Когда новый элемент поступает в очередь, самый старый “вываливается” из нее.
    При поступлении нового элемента надо соответственно обновить (читай перерисовать) визуальное представление. Каждый раз перерисовывать N элементов можно – в рамки доступных ресурсов это укладывается. Но запаса не остается.

    Поэтому я хотел попробовать не перерисовывать все заново, а сдвигать-и-дорисовывать. Возможно это будет эффективней.

  6. Adoapp:

    : Да-да, как один из вариантов сойдет, хотя и не очень красиво. Надо попробовать.

  7. LanTunes:

    : я думаю, что перерисовать все заново выйдет, скорее всего, быстрее и проще.

  8. Floon:

    У битмапа делаешь LockBits, потом делаешь покоординатный сдвиг влево на величину шага (двойной цикл for получится) ну и потом дорисовываешь что нужно.
    http://msdn.microsoft.com/ru-ru/library/…

  9. Adoapp:

    : Да я уже тоже так думаю. Но попробовать стоит.

  10. Adoapp:

    : А как у него с производительностью будет? Мне кажется вложенные форы все загубят.

  11. Floon:

    : нормально всё будет! Именно для того, что бы было нормально и надо сделать LockBits. Потом кусками же буфер будет двигаться всё.
    Пространственные фильтры изображений тоже делают покоординатно всё и не тормозят же

  12. Floon:

    : простите, немного коряво описал ситуацию. Щас исправлюсь.
    метод LockBits предоставляет лучшую производительность для крупномасштабных изменений. У простого битмапа есть метод SetPixel. и он тормозной. Рефлектором можно посмотреть почему он именно такой тормозной.
    LockBits позволяет получить доступ к памяти как бы напрямую. Потому тормозов не будет наблюдаться.

  13. LanTunes:

    : чтобы не тормозило, ему нужно будет битмап двигать не попиксельно, а построчно каким-нибудь memove, которого в принципе нет в C#, хотя можно его, конечно, выколупать DllImport-ом откуда-то. И не факт, что это будет быстрее, чем рисовать напрямую, все таки рисовалка может быть реализована аппаратно, а тут все это будет через CPU гоняться однозначно.

  14. Floon:

    : Реализована аппаратно?! Он же сразу написал что надо решение на C#. И да, блочное копирование никто не отменял. И да, тормозить не будет. Если совсем задолбать меня вопросами – выложу код (=

  15. LanTunes:

    : я имел ввиду вызов BitBlt вполне может быть реализован с применением аппаратного ускорения.

  16. Adoapp:

    : Ага! У нас тут спор между LockBits и BitBlt! Если отойду после рабочего дня, сравню их по относительной производительности.

  17. LanTunes:

    : да какой спор? Разные же вообще вещи..

  18. NotLt:

    А что за шрифт на картинке? )

Добавить комментарий