c # Рисует изображение (масштабируется) в графике, неправильно интерполируется. Исправления? - PullRequest
4 голосов
/ 10 декабря 2010

У меня есть изображение шириной 1 пиксель и некоторой высоты. Мне нужно нарисовать это изображение по всей ширине элемента управления в его событии OnPaint. Я заставляю его рисовать, но не правильно. Кажется, что когда он растягивается, он на самом деле не заполняет все пиксели. Как будто интерполяция выключена. Есть ли способ сказать «перестань быть умным, просто нарисуй это уже»? Я не вижу InterpolationMode.Off или .None в опциях для графического объекта.

Я могу подтвердить, что на самом деле рисую всю ширину, используя изображение шириной X, где X - такая же ширина, как у элемента управления Затем, когда он рисует, он покрывает всю область как обычно. Однако этот элемент управления постоянно изменяется, и для экономии памяти и всего того джаза, использующего изображения шириной 1px, это вполне нормально в веб-мире. Это для настольного приложения C #, хотя. Есть идеи как это исправить?

Ответы [ 2 ]

9 голосов
/ 13 декабря 2010

Хорошо, я разобрался с волшебными ключевыми словами:

g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;

Это в сочетании с установкой режима интерполяции на NearestNeighbour позволяет рисовать полный блок.

Без настройки режима интерполяции вы получите странное смешивание (ожидаемое). Без установки PixelOffsetMode алгоритм ближайшего соседа не имеет соседа для сравнения на пустой краске и, следовательно, рисует только половину изображения для половины ширины. Устанавливая его на половину смещения, перемещает все на -0,5 пикселя и позволяет этому алгоритму работать с блочными текстурами.

0 голосов
/ 10 декабря 2010

InterpolationMode.NearestNeighbor - это то, что вы хотите использовать в этом случае.

...