Управление / изменение размера / масштабирование изображения в vb.net - PullRequest
2 голосов
/ 25 мая 2010

Представьте, что у меня есть прямоугольник, скажем, 400px x 300px. Тогда скажем, я хочу загрузить изображение в этом. Все это очень просто, используя Sytem.Drawing.DrawImage .

Прямоугольник http://img576.imageshack.us/img576/2363/rectangle.gif

Но затем я хочу оставить левую сторону размером 300 пикселей, но изменить правую сторону на 250 пикселей. Я могу нарисовать прямоугольник, используя 4 DrawLines, но я не знаю, как раздавить изображение в новую форму. Я хочу, чтобы правая часть фигуры была 250, левый размер 300, а верх и низ 400px.

Изменение размера http://img85.imageshack.us/img85/3479/rectangle2.gif

Я не могу использовать DrawImage, так как он ожидает, что левый и правый размеры будут одинаковыми. Есть ли способ манипулировать изображением в новую форму?

Я смотрел на другие вопросы , но они применяются только там, где левая и правая части равны.

Есть мысли о том, как раздавить изображение в форму, у которой не было параллельных сторон?

(Если это поможет, я с удовольствием пожертвую качеством изображения, чтобы соответствовать правильной форме.)

Ответы [ 3 ]

2 голосов
/ 25 мая 2010

Отказ от ответственности: я работаю на Atalasoft.

В нашем продукте DotImage есть команда QuadrillarWarpCommand, которая может это сделать. Это в DotImage Photo .

1 голос
/ 25 мая 2010

То, что вы хотите сделать, нетривиально (но также очень мощно).

@ Хайнци прав, общий класс называется преобразованиями деформации. Что вы пытаетесь сделать, так это перспективное преобразование . На высоком уровне это включает в себя запуск отдельных координат через матрицу преобразования для получения их новых позиций, а затем выполнение интерполяции между значениями пикселей на основе старого и нового местоположений.

В этой статье говорится о некоторых трансформациях, одна из которых - явная, поэтому она может быть полезна в целом. Я не уверен, я не читал это близко. В общем, вы хотите найти в Google что-то вроде «преобразования изображения c #» или «преобразования перспективы изображения c #».

В зависимости от того, для чего вы планируете использовать ее, покупка библиотеки может быть лучшим способом сделать это, хотя многое можно узнать о манипуляции с изображениями, сделав это самостоятельно.

1 голос
/ 25 мая 2010

Я не нашел решения вашей проблемы, но у меня есть некоторая информация, которая может вам помочь:

То, что вы хотите, называется преобразованием основы .

Насколько я знаю, платформа .net изначально поддерживает этот вид преобразования только для GraphicsPath, а именно для метода GraphicsPath.Warp . К сожалению, я не думаю, что это поможет вам, если вы не готовы перерисовать изображение, используя объект .net GraphicsPath .

Если вам нужно преобразование непосредственно в слое пользовательского интерфейса, ваша библиотека пользовательского интерфейса может помочь: например, Silverlight включает в себя класс PlaneProjection , который можно использовать для таких эффектов; в WPF для этого может быть полезен 3D-движок (требующий дополнительных усилий программирования).

...