在vb.net中操作/调整大小/缩放图像

时间:2010-05-24 22:22:59

标签: vb.net image image-manipulation

想象一下,我有一个说400px x 300px的矩形。然后,假设我想在其中加载图像。使用Sytem.Drawing.DrawImage非常容易。

Rectangle http://img576.imageshack.us/img576/2363/rectangle.gif

但是我想把左手边留下300px但是把右手边改成250像素。我可以使用4个DrawLines绘制框,但我不知道如何将图像压缩成新的形状。我希望形状的右侧为250,左侧尺寸为300,顶部和底部为400px。

Resized http://img85.imageshack.us/img85/3479/rectangle2.gif

我不能使用DrawImage,因为它希望左右尺寸相同。有没有办法将图像处理成新的形状?

我查看了other questions,但它们只适用于左右两侧相等的地方。

关于如何将图像压缩成没有平行边的形状的任何想法?

(如果有帮助,我很乐意牺牲图像质量以适应正确的形状。)

3 个答案:

答案 0 :(得分:2)

免责声明:我在Atalasoft工作。

我们的DotImage产品有一个名为QuadrilateralWarpCommand的命令可以执行此操作。它在DotImage Photo

答案 1 :(得分:1)

我没有找到问题的解决方案,但我有一些可能对您有帮助的信息:

您想要的是 warp transformation

据我所知,.net框架本身仅支持GraphicsPath的这种转换,即GraphicsPath.Warp方法。不幸的是,除非您愿意使用.net GraphicsPath对象重绘图像,否则我认为这不会对您有所帮助。

如果您需要直接在UI层中进行转换,您的UI库可能会有所帮助:例如,Silverlight包含PlaneProjection class,可用于此类效果;在WPF中,3D引擎可能对此有用(需要更多的编程工作)。

答案 2 :(得分:1)

你想要做的事情是非平凡的(但也非常强大)。

@Heinzi是正确的,一般类称为warp变换。您要做的是具体的透视转换。在较高的层次上,它涉及通过变换矩阵运行各个坐标以获得它们的新位置,然后根据旧位置和新位置在像素值之间进行插值。

This文章讨论了一些转变,其中一个是纯粹的,所以它可能总体上有帮助。我不确定,我没有仔细阅读。一般来说,你想谷歌的东西大概像“c#图像转换”或“c#图像透视变换”。

根据您计划使用它的目的,购买图书馆可能是最好的方法,尽管通过自己动手来学习图像操作有很多东西。