English 中文(简体)
图像旋转算法 [关闭]
原标题:
  • 时间:2009-01-27 18:19:52
  •  标签:

我们不允许寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,使其可以用事实和引用回答。

Closed 2 years ago.

我正在寻找一种算法,可以将图像旋转一定角度(输入)。

public Image rotateImage(Image image, int degrees)

(Image instances could be replaced with int[] containing each pixel RGB values, My problem is that i need to implement it for a JavaME MIDP 2.0 project so i must use code runnable on JVM prior to version 1.5 Can anyone help me out with this ?

抱歉,我忘了提到我没有可用的SVG API,并且我需要一种方法来以任意角度旋转,而不仅仅是90-180-270度。

此外,在MIDP 2.0上不可用java.awt.*包。

最佳回答

我在互联网上找到的最好的描述图像旋转算法的页面之一,与丹·布隆伯格(Dan Bloomberg)的极好的Leptonica库相关联。虽然Leptonica库本身是用C编写的,对您没有帮助,但他关于图像旋转算法的页面:

将此翻译为中文:http://www.leptonica.org/rotation.html http://www.leptonica.org/rotation.html

绝对值得一读。您很可能会想要实现他在页面第二部分中描述的面积映射旋转算法。

问题回答

一般解决方案:针对目标图像中的每个像素,使用旋转方向相反的坐标来获取源图像中的像素。

解决方案的改进:旋转通常不会给出精确的像素坐标。根据它们重叠的百分比对源像素及其邻居进行加权平均。

更快的二进制图像解决方案:将图像转换为连续前景像素的“运行”。然后旋转这些线的端点并将它们画到目标中。

通常情况下,由于整数四舍五入而产生轻微的间隙,因此当一个或两个端点距离整数超过10%时,通过绘制两条线来修补单个源线,使用四舍五入的整数坐标向上和向下。

如果一个端点在10%以内,而另一个端点不在,则两条线将形成一个V形。如果两个端点的偏差都超过10%,则两条线将形成一个X形。

这可以针对X轴或Y轴完成。使用与旋转角度之间角度最小的轴。 (即,如果旋转角度在45到-45之间,则使用X轴。)

如果背景像素比前景像素少,用前景填充目标,接着用背景像素执行上述算法,这是二进制图像的更快解决方案。

Graphics2D和AffineTransform可以帮助您实现您想要的功能。具体来说,是通过Graphics2D.drawImage(Image,AffineTransform)和AffineTransform.getRotateInstance。您还可以使用此功能进行缩放,平移和倾斜。这两个类至少从1.4运行时开始就一直存在,可能更早。

  public Image rotateImage(Image img, float degrees){
   BufferedImage sourceBI = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_ARGB);
   sourceBI.getGraphics().drawImage(img,0,0,null);
   AffineTransform at = new AffineTransform();
   at.rotate(degrees*Math.PI/180, sourceBI.getWidth()/2, sourceBI.getHeight()/2);
   BufferedImageOp bio = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
   return bio.filter(sourceBI, null);
  }




相关问题
热门标签