GD Star Rating
loading...
loading...
Друганы, подскажите как сделать такой вот сдвиг изображения (Bitmap допустим) на C#. Желательно поэффективнее.
Друганы, подскажите как сделать такой вот сдвиг изображения (Bitmap допустим) на C#. Желательно поэффективнее.
Вывести битмап с отрицательной координатой X?
: Не не. Битмап сам не трогаем. Только его содержимое – пиксели. Получается как-бы скопировать часть пикселей левее. Ну типа как рисуешь осциллограмму, новые данные рисуются, а старые теряются.
Вот проэту функцию почитай. Она позволяет копировать куски битмапины с контекста на контекст. Не C#, конечно, но через C# можно вызывать Windows-функции и вытаскивать контекст. Работает шустрее, чем класс Graphics в.NET
: я думаю, что система выведет тебе битмап внутрь контекста (не обзятально на экран) гораздо быстрее, чем ты будешь заморачиваться с переносом байтиков туда-сюда, возможно что это будет сделано даже аппаратно. Вон ниже BitBlt предложили, например, допустим – смысл тот же, берешь контекст, выводишь в него битмап в минуса, дорисовываешь сего тебе надобно и выводишь на девайс.
: Это не подходит, так как мне надо сохранять все изменения в битмапе. Опишу подробнее.
Имеются поступающие данные. Необходимо визуализировать последние N-элементов данных. Есть очередь, где хранятся эти N элементов. Когда новый элемент поступает в очередь, самый старый “вываливается” из нее.
При поступлении нового элемента надо соответственно обновить (читай перерисовать) визуальное представление. Каждый раз перерисовывать N элементов можно – в рамки доступных ресурсов это укладывается. Но запаса не остается.
Поэтому я хотел попробовать не перерисовывать все заново, а сдвигать-и-дорисовывать. Возможно это будет эффективней.
: Да-да, как один из вариантов сойдет, хотя и не очень красиво. Надо попробовать.
: я думаю, что перерисовать все заново выйдет, скорее всего, быстрее и проще.
У битмапа делаешь LockBits, потом делаешь покоординатный сдвиг влево на величину шага (двойной цикл for получится) ну и потом дорисовываешь что нужно.
http://msdn.microsoft.com/ru-ru/library/… ;
: Да я уже тоже так думаю. Но попробовать стоит.
: А как у него с производительностью будет? Мне кажется вложенные форы все загубят.
: нормально всё будет! Именно для того, что бы было нормально и надо сделать LockBits. Потом кусками же буфер будет двигаться всё.
Пространственные фильтры изображений тоже делают покоординатно всё и не тормозят же
: простите, немного коряво описал ситуацию. Щас исправлюсь.
метод LockBits предоставляет лучшую производительность для крупномасштабных изменений. У простого битмапа есть метод SetPixel. и он тормозной. Рефлектором можно посмотреть почему он именно такой тормозной.
LockBits позволяет получить доступ к памяти как бы напрямую. Потому тормозов не будет наблюдаться.
: чтобы не тормозило, ему нужно будет битмап двигать не попиксельно, а построчно каким-нибудь memove, которого в принципе нет в C#, хотя можно его, конечно, выколупать DllImport-ом откуда-то. И не факт, что это будет быстрее, чем рисовать напрямую, все таки рисовалка может быть реализована аппаратно, а тут все это будет через CPU гоняться однозначно.
: Реализована аппаратно?! Он же сразу написал что надо решение на C#. И да, блочное копирование никто не отменял. И да, тормозить не будет. Если совсем задолбать меня вопросами – выложу код (=
: я имел ввиду вызов BitBlt вполне может быть реализован с применением аппаратного ускорения.
: Ага! У нас тут спор между LockBits и BitBlt! Если отойду после рабочего дня, сравню их по относительной производительности.
: да какой спор? Разные же вообще вещи..
А что за шрифт на картинке? )
ВЫ СЕРЬЕЗНО?